2013-04-17 2 views
-2

Итак, у меня есть BMP-файл, и я хочу извлечь детали rgb для каждого пикселя изображения.Получите значение RGB каждого пикселя из файла bmp

Я где-то читал, что следующий будет делать это для меня

int main(){ 
int image[100][3]; // first number here is 100 pixels in my image, 3 is for RGB  values 
FILE *streamIn; 
int i; 
streamIn = fopen("./t.bmp", "r"); 
if (streamIn == (FILE *)0){ 
    printf("File opening error ocurred. Exiting program.\n"); 
    return 0; 
} 

    int byte; 
    int count = 0; 
    for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header 

    for(i=0;i<100;i++){ // foreach pixel 
    image[i][2] = getc(streamIn); // use BMP 24bit with no alpha channel 
    image[i][1] = getc(streamIn); // BMP uses BGR but we want RGB, grab byte-by-byte 
    image[i][0] = getc(streamIn); // reverse-order array indexing fixes RGB issue... 
    //printf("[%d,%d,%d] ",image[i][0],image[i][1],image[i][2]); 
    if(image[i][0]==255 && image[i][1]==255 && image[i][2]==255) 
     printf("B"); 
    else if(image[i][0]==0 && image[i][1]==0 && image[i][2]==0) 
     printf("W"); 
    else{ 
     printf("[%d,%d,%d]",image[i][0],image[i][1],image[i][2]); 
     //return 0; 
    } 
    } 

    fclose(streamIn); 
    return 0; 
} 

Теперь, учитывая мой BMP файл будет 10 * 10 пикселей, будет выше метод работы?

Редактировать Я добавил ответ, возможно, это может помочь кому-то. Приветствия.

+2

Вы пробовали? Правильно ли это? –

+1

Эта программа предполагает 24-битные данные пикселя BMP и делает предположение о размере заголовка. Несмотря на то, что это типично, я предлагаю вам изучить, как работает формат [BMP] (http://en.wikipedia.org/wiki/BMP_file_format). Возможно, вы не работаете с точно таким же файловым форматом (даже если это возможно). – Hydronium

+0

@JoachimPileborg хорошо у меня был jpg со мной, и я преобразовал его в bmp с помощью imagemagick, используя 'convert -threshold xx% ' с установленным пороговым значением. Я думал, что все пиксели будут иметь значение 000 или 255 255 255, но некоторые из них имеют разные значения. – Kraken

ответ

2

Этот образец кода очень груб, и я бы не рекомендовал делать это таким образом.

Однако, если вы настаиваете, есть правило, о котором вам нужно знать: каждая строка дополняется точным кратным 4 байтам. В вашем случае строка 10 * 3 или 30 байт, поэтому она получает 2 дополнительных байта заполнения. Если вы не учтете это, прочитав файл, вы не будете.

+0

@padding находится справа или слева? И какова длина заголовка? – Kraken

+0

@ Кракен справа. Я не знаю точный размер заголовка, но значение, которое вы используете, не выглядит вне линии. –

+0

Да, спасибо за дополнительную информацию, иначе я бы потерялся, пытаясь выяснить эти побочные результаты. – Kraken

0

Итак, я создал три разных файла BMP из трех разных jpg, каждый с различным количеством пикселей, и вот что я узнал.

  1. Информация о заголовке, или в основном, цвет каждого пикселя, начинает отображаться после 138 байт данных.
  2. Mark Random правильно предположил о заполнении, что каждая строка должна иметь кратность 4 в виде числа байтов.
  3. плюсованные байт, получить значение 0.

Приведенные выше выводы основаны на случаях, которые я взял, и ни в коей мере обобщенно. Надеюсь, поможет.

+0

Вы могли извлечь три канала? –

+0

@Ofir Attia Yeah, Это сработало отлично для меня. – Kraken