2009-12-16 4 views
10

Как открыть и прочитать пиксели изображения в C++? Прочтите их в форме X, Y и узнайте цвет.Чтение пикселей изображения в C++

+1

Любой конкретный формат изображения? Различные форматы имеют разные библиотеки. –

+1

Какой формат изображения? BMP? PNG? JPEG? –

+0

Возможно, JPG или BMP. Он будет извлечен из openGL, поэтому я еще не уверен. Это имеет значение? Если да, то что лучше? –

ответ

3

Если вы собираетесь работать с изображениями, вы должны смотреть в библиотеку OpenCV, он имеет почти все вам нужно работать с изображениями.

OpenCV 2.0 вышел пару месяцев назад и очень дружен с C++.

+4

OpenCV является излишним для простого чтения изображений. –

+0

Да, это большая библиотека, я просто ставил ее как вариант, если он хочет делать другие вещи, кроме чтения/записи, было бы хорошо ознакомиться с ним. – rem7

5

Используйте библиотеку, как DevIL (http://openil.sourceforge.net/). DevIL загрузит данные изображения в массив, и вы можете получить доступ к необработанным пиксельным данным с помощью функции ilGetPixels() или так далее.

DevIL также имеет поддержку OpenGL.

+0

s/ilGetPixels()/ilGetData() –

2

BMP невероятно просто. Несжатые BMP состоят из заголовка, некоторой информации о BMP, цветовой палитре (если применимо), а затем данные растрового изображения, пиксель за пикселем. Написание собственного анализатора растровых изображений - забавное упражнение, хотя есть много дополнительных функций обработки всех функций (8-битное, RLE-сжатие и т. Д.).

Лучше всего использовать библиотеку. Image Magick имеет библиотеку C, которая позволит вам открыть практически любой формат изображения и получить доступ к пикселям. SDL_image - это еще одна библиотека, которая очень проста в использовании, и SDL можно легко использовать с OpenGL.

Формат изображения, который вы должны использовать, зависит от приложения. JPG имеют довольно хорошее сжатие, но сжатие LOSSY, что означает, что вы теряете детали. Если изображение имеет текст или имеет большие области сплошных цветов или краев (например, комикс), это плохо, вы получите заметный артефакт. Для фотографий JPG, как правило, прекрасны. PNG - отличная альтернатива, они сжаты, но сжатие ПОТЕРЯНО. JPG, как правило, будут меньше PNG, оба будут меньше, чем BMP.

4

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

В зависимости от ваших требований вам также может потребоваться использование возможностей формата. Если поддержка высокого динамического диапазона интересна, OpenEXR - отличный выбор, если это не так, вероятно, просто неудобно, так как у него нет такой большой поддержки среди других программ, как, например, PNG.

Вот две библиотеки я часто обращаюсь, когда необходимость читать и записывать изображения: libpng, OpenExr

+0

Мы используем libpng для генерации изображений, это очень простой в использовании и чистый C++-код, поэтому не нужно иметь дело с дрянным интерфейсом. –

+1

@Matthieu M .: libpng, конечно, не написано на «чистом C++». Это написано на C89, поскольку оно указано на странице, связанной с Laserallan. – unwind

5

Чтение цвет пикселя из файла изображения с помощью библиотеки Magick++

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 
using namespace std; 

int main(int argc, char **argv) { 
try { 
    InitializeMagick(*argv); 
    Image img("C:/test.bmp"); 
    ColorRGB rgb(img.pixelColor(0, 0)); // ie. pixel at pos x=0, y=0 
    cout << "red: " << rgb.red(); 
    cout << ", green: " << rgb.green(); 
    cout << ", blue: " << rgb.blue() << endl; 
} 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
} 
return 0; 
} 
Смежные вопросы