2009-12-16 201 views
10

如何在C++中打开并读取图像的像素?以X,Y的形式阅读它们并了解颜色。在C++中读取图像像素

+1

任何特定的图像格式读取一个像素的颜色从图像文件?不同的格式有不同的库。 – 2009-12-16 22:30:22

+1

图像是什么格式? BMP? PNG? JPEG? – 2009-12-16 22:30:25

+0

可能是JPG或BMP。它将从openGL中提取,所以我还不确定。有关系吗?如果是,哪个更好? – 2009-12-16 22:31:56

回答

3

如果你要与你应该看看OpenCV库的图像进行工作,它拥有几乎一切你需要处理图像。

几个月前OpenCV 2.0问世了,它非常友好的使用C++。

+4

OpenCV仅仅是为了读取图像而过度使用。 – 2009-12-17 11:08:23

+0

是的,它是一个很大的图书馆,如果他想要做其他的东西,而不是阅读/书写,那么可以把它作为一个选择,这对我们来说很熟悉。 – rem7 2009-12-17 18:00:41

5

使用类似DevIL的图书馆(http://openil.sourceforge.net/)。 DevIL会将图像数据加载到一个数组中,您可以使用像ilGetPixels()等函数来访问原始像素数据。

DevIL也支持OpenGL。

+0

s/ilGetPixels()/ ilGetData() – 2011-08-26 09:27:10

2

BMP令人难以置信的简单。未压缩的BMP包含一个头文件,一些关于BMP的信息,调色板(如果适用),然后是位图数据,逐个像素。编写自己的位图解析器是一个有趣的练习,尽管处理所有功能(8位,RLE压缩等)需要很多额外的工作。

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

你应该使用什么图像格式将取决于应用程序。 JPG有很好的压缩效果,但是压缩效果是LOSSY,这意味着你失去了细节。如果图像有文字,或者有大面积的纯色或边缘(如漫画),这是不好的,你会得到明显的制造。对于照片,JPG通常很好。 PNG是一个不错的选择,它们被压缩,但压缩是无效的。 JPG通常比PNG小,都会比BMP小。

4

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

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

这里有两个库,我经常把需要读取和写入图像时: libpngOpenExr

+0

我们使用libpng进行图像生成,它非常易于使用且纯粹的C++代码,因此无需处理糟糕的界面。 – 2009-12-17 11:42:05

+1

@Matthieu M .: libpng当然不是用“纯C++”编写的。它是用C89编写的,因为它在Laserallan链接的页面上陈述。 – unwind 2009-12-17 12:46:46

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