Получение значения пикселя BMP-файла
Вопрос
у меня возник вопрос по чтению bmp-изображения.Как я могу получить значение пикселя (значения R, G, B) в изображении bmp?Кто-нибудь может помочь мне использовать язык программирования C?
Решение
Самый простой способ - найти хорошую библиотеку обработки изображений для выбранной вами платформы и использовать ее.
- Linux ImLib / GDK-Pixbuf (Gnome/GTK) / Изображение QT (KDE/ Qt) должен быть в состоянии делать то, что вам нужно.
- Windows Я не знаком с соответствующей системной библиотекой, но Поиск в MSDN по "Растровому изображению" вероятно, это хорошее место для начала.
- Mac OSX Cocoa обладает некоторыми возможностями манипулирования изображениями, см. эта статья.
Трудный способ состоял бы в том, чтобы открыть файл и фактически интерпретировать двоичные данные внутри.Для этого вам понадобится Спецификация файла BMP.Я бы порекомендовал сначала попробовать самый простой способ.
Другие советы
Примечание:возможно, вам потребуется выделить дополнительный байт для альфа-значений, если ваш BMP имеет альфа-канал.В этом случае изображение было бы image[pixelcount][4]
, и вы бы добавили еще один getc(streamIn)
строка для удержания этого четвертого индекса.Оказалось, что моей БМП это не нужно.
// 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
Вам необходимо изучить формат файла BMP.Это облегчает чтение несжатых 24-битных BMP-файлов.Они просто содержат заголовок в начале и значения RGB для каждого пикселя.
Чтобы начать с этого, проверьте пример растрового изображения 2x2 на http://en.wikipedia.org/wiki/BMP_file_format.Выполните следующие действия.
- Создайте изображение размером 2x2 BMP, показанное в Википедии.
- Откройте файл в двоичном режиме с помощью вашей программы на языке Си.
- Найдите позицию байта 54.
- Считайте 3 байта.
Байты будут равны 0, 0 и 255 соответственно.(Не уверен, соответствует ли порядок RGB.Я сделал это давным-давно, и я думаю, что порядок не соответствует RGB.Просто убедитесь в этом.)
Вот так просто!Изучите заголовок BMP, чтобы больше узнать о формате.