2009-12-28 4 views

ответ

7

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

  • LinuxImLib/GDK-Pixbuf (Gnome/GTK)/QT Image (KDE/Qt) должны быть в состоянии делать то, что вам нужно.
  • Windows Я не знаком с соответствующей системной библиотекой, но MSDN Search for "Bitmap", вероятно, является хорошим местом для начала.
  • Mac OSX У какао есть некоторые возможности для обработки изображений, см. this article.

Трудным способом было бы открыть файл и фактически интерпретировать двоичные данные внутри. Для этого вам понадобится BMP File Specification. Я бы посоветовал сначала попробовать простой способ.

6

Вам необходимо изучить формат файла BMP. Легче читать несжатые 24-битные файлы BMP. Они просто содержат заголовок в начале и значения RGB для каждого пикселя.

Для начала ознакомьтесь с примером изображения растрового изображения 2x2 на http://en.wikipedia.org/wiki/BMP_file_format. Выполните следующие шаги.

  1. Создайте изображение 2x2 BMP, указанное в Википедии.
  2. Открыть файл в двоичном режиме, используя вашу программу на C.
  3. Искать в байте позиции 54.
  4. Прочитано 3 байт.

Байт будет 0, 0 и 255 соответственно. (Не уверен, что заказ RGB. Я сделал это долго назад, и я думаю, что заказ не RGB. Просто подтвердите это.)

Как просто! Изучите заголовок BMP, чтобы больше узнать о формате.

10

Примечание: вам может понадобиться получить дополнительный байт для альфа-значений, если ваш BMP имеет альфа-канал. В этом случае изображение будет image[pixelcount][4], и вы добавите еще одну строку getc(streamIn), чтобы сохранить этот четвертый индекс. Мой BMP оказался не нужен.

// super-simplified BMP read algorithm to pull out RGB data 
// read image for coloring scheme 
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values 
FILE *streamIn; 
streamIn = fopen("./mybitmap.bmp", "r"); 
if (streamIn == (FILE *)0){ 
    printf("File opening error ocurred. Exiting program.\n"); 
    exit(0); 
} 

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

for(i=0;i<1024;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("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]); 
} 

fclose(streamIn); 

~ Locutus

+0

нет заголовочного блока вам необходимо пройти, прежде чем попасть в данные изображения? –

+1

@Anon Что делать, если мой файл jpeg? – Kraken

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