#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
FILE* bmp = NULL;
uint32_t offset;
uint8_t* temp = NULL;
size_t read;
unsigned int x_dim = 600, y_dim = 388;
bmp = fopen("test_colour.bmp", "r");
if (!bmp)
return -1;
/* Get the image data offset */
fseek(bmp, 10, SEEK_SET);
fgets((char*)&offset, 4, bmp);
printf("Offset = %u\n", offset);
temp = malloc(3*x_dim*y_dim*sizeof(uint8_t));
if (!temp)
return -1;
/* Go the the position where the image data is stored */
fseek(bmp, offset, SEEK_SET);
/* Copy image data to array */
printf("%u bytes requested!\n", 3*x_dim*y_dim);
read = fread((void*)temp, sizeof(uint8_t), 3*x_dim*y_dim, bmp);
printf("%Iu bytes read!\n", read);
fclose(bmp);
free(temp);
return 0;
}
Sto utilizzando il codice precedente per leggere i dati RGB di un'immagine BMP a 24 bit per pixel su un array. L'offset dall'inizio del file in cui i dati dell'immagine iniziano (dopo l'intestazione BMP) viene fornito all'offset 10 in base alle specifiche BMP. Ottengo il seguente risultato quando si esegue il codice sopra.Valore di ritorno imprevisto da fread()
Offset = 54
698400 bytes requested!
33018 bytes read!
L'output di offset sembra essere corretto perché la dimensione del file è 698454 byte (= 698400 + 54). Tuttavia, il valore restituito da fread()
sembra indicare che non è possibile leggere l'intero dato dell'immagine. Tuttavia, sto successivamente utilizzando i dati nell'array temp
per convertire i dati RGB in scala di grigi e scrivere nuovamente questi dati in un file BMP. Il controllo visivo dell'immagine di output non indica alcun errore, ad esempio sembra che in realtà io legga l'intera immagine di input in primo luogo sebbene fread()
sembra indicare diversamente.
Qualcuno può spiegare questo comportamento?
Due domande: 1) Puoi controllare il contenuto di 'temp' dopo la chiamata a' fread', per vedere se in realtà ha smesso di leggere dopo 33018 byte? 2) Non ho familiarità con l'identificatore di formato '% Iu' - puoi verificare il valore attuale di' read' nel debugger? – Treb
Non penso che questo stia causando i sintomi che stai vedendo, ma dovresti usare le stringhe di formato 'printf' corrette. Il formato per 'size_t' è' "% zu" '. '"% Iu "' non è standard. Se la tua implementazione non supporta '"% zu "', puoi usare 'printf ("% lu byte letti! \ N ", (unsigned long) read);' –
Sto usando gcc con MinGW per compilare e il il compilatore non riconosce l'identificatore '% zu' (ho provato ad usarlo prima). Ho letto che bisogna usare '% Iu' in Windows. – simon