2013-07-31 8 views
2

Я пытаюсь прочитать пиксельные данные из растрового изображения в массив структурированных (который содержит цвета R, G и B для цветов). Я использую 12x12px изображение только для тестирования (потому что я считаю, что спецификация bmp говорит, что пиксельные данные дополняются нулями в конце каждой строки, чтобы сделать ее выровненной по слову. Ширина 12 пикселей автоматически выравнивается по слову.Загрузить данные пикселя BMP в массив C

Вот код, я использую. INFOHEADER и FILEHEADER разбираются прекрасно, и 12х12 2D массив IMAGE s im создается. Однако печать данных RGB для каждого пикселя гравюр мусора.

typedef struct __attribute__((__packed__)) { 
    unsigned char b; 
    unsigned char g; 
    unsigned char r; 
} IMAGE; 

int main(void) { 
    FILEHEADER fh; 
    INFOHEADER ih; 
    FILE *img = fopen("pic.bmp", "rb"); 
    fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img); 
    fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img); 

    IMAGE im[ih.width][ih.height]; 
    fseek(img, fh.imageDataOffset, 0); 
    int i, j; 
    for (i = ih.height-1; i >= 0; i--) { 
     for (j = 0; j < ih.width; j++) { 
      fread(&im[i][j], sizeof(unsigned char), sizeof(IMAGE), img); 
      printf("%x%x%x ", im[i][j].r, im[i][j].g, im[i][j].b); 
     } 
     printf("\n"); 
    } 
    printf("w = %d, h = %d\n", ih.width, ih.height); 
} 

Однако для 12x12px полностью белая растровая карта, эти выходы:

ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
000 ca800 ff574b 007f 001 000 b000 574bc9 07fff 44c40 ff8690 007f 
9077b0 7fff86 8000 574bca 07fff 0a00 ff7482 007f 4bc950 7fff57 2f00 86906d 
07fff 60a50 ff8690 007f 4bc9d0 7fff57 ee00 87418 000 c9300 ff574b 007f 
4bc8f0 7fff57 700 868b3c 07fff 400 000 000 820a0 7fff74 3000 574bc9 
07fff 6000 1877 000 0100 000 000 004 000 1000 000 000 
820a0 7fff74 000 0010 000 6000 1874 000 4bc8d0 7fff57 b300 868b31 
000 38b30 051f9 000 000 000 000 000 000 010 000 000 
745069 018 f700 ffffff 181a4 080 000 000 01f5 0140 000 000 

Может ли кто-нибудь увидеть, что я делаю неправильно? Это может быть проблема выравнивания?

Благодаря

EDIT:

Это скриншот нижней части растрового файла. Кажется, есть 144 (12x12) белых пикселей (выделено). Последние два нуля - это отступы. По-прежнему не имеет смысла, что моя программа не анализирует это должным образом, хотя.

enter image description here

+2

Вы меняете высоту и ширину в вашей петле считывания. Не проблема здесь (для квадратного изображения), но вы можете ее исправить. Вы можете проверить, что sizeof (IMAGE) равен 3? Кроме того, вы можете открыть BMP-изображение в шестнадцатеричном просмотре и проверить, нет ли байта заполнения между триплетами rgb? – usr2564301

+0

Да sizeof (IMAGE) равно 3. И посмотрите мое редактирование для заполнения –

+0

Вы пытались использовать распакованную структуру? – urzeit

ответ

1

Хорошо получается, что я спас мою пустую BMP, как 8bit вместо 24bit. 8bit использует таблицу цветов, и каждый пиксель ссылается на запись в таблице цветов, чтобы получить свои данные. 24 бит bmp использует 3 байта на пиксель, и каждый байт представляет значения R, G и B, поэтому ему не нужна таблица цветов.

Смежные вопросы