用C ++读取图像的像素

时间:2009-12-16 22:28:53

标签: c++ image-processing

如何在c ++中打开和读取图像的像素?以X,Y的形式阅读它们并知道颜色。

5 个答案:

答案 0 :(得分:10)

使用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;
}

答案 1 :(得分:5)

使用像DevIL(http://openil.sourceforge.net/)这样的库。 DevIL会将图像数据加载到数组中,您可以使用ilGetPixels()等函数访问原始像素数据。

DevIL也有OpenGL支持。

答案 2 :(得分:5)

您可以使用现有库,也可以编写自己的代码。通常第一种方法更好,因为图像文件格式通常比在表面上看起来更复杂,如果不小心,最终可能会出现颠倒的图像或不正确的颜色组件顺序。

根据您的要求,您可能还需要考虑格式的功能。如果对高动态范围的支持很有意思,OpenEXR是一个很好的选择,如果不是它可能只是不方便,因为它没有像其他程序那样大的支持,例如PNG。

以下是我需要读取和写入图像时经常使用的两个库: libpngOpenExr

答案 3 :(得分:4)

BMP简直令人难以置信。未压缩的BMP由标题,关于BMP的一些信息,调色板(如果适用)以及位图数据(逐个像素)组成。编写自己的位图解析器是一项有趣的练习,尽管有很多额外的工作处理所有功能(8位,RLE压缩等)。

您最好的选择是使用图书馆。 Image Magick有一个C库,可以让您打开任何图像格式并访问像素。 SDL_image是另一个非常易于使用的库,SDL可以很容易地与OpenGL一起使用。

您应该使用哪种图像格式取决于应用程序。 JPG具有相当好的压缩性,但压缩是LOSSY,这意味着你会丢失细节。如果图像有文字,或者有大面积的纯色或边缘(如漫画)这很糟糕,那么你会得到明显的瑕疵。对于照片,JPG通常很好。 PNG是一个不错的选择,它们是压缩的,但压缩是无用的。 JPG通常小于PNG,两者都小于BMP。

答案 4 :(得分:4)

如果您打算使用图像,您应该查看OpenCV库,它几乎包含了处理图像所需的一切。

OpenCV 2.0几个月前问世,它与C ++非常友好。