如何在c ++中打开和读取图像的像素?以X,Y的形式阅读它们并知道颜色。
答案 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。
答案 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 ++非常友好。