Чтение пикселей изображения в С++

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Чтение цвета пикселя из файла изображения с помощью библиотеки 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;
}

Ответ 4

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

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

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

Ответ 5

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

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

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