C++中读取图像像素

21
如何在C++中打开和读取图像像素?以X、Y的形式读取并获取颜色。

1
有特定的图像格式吗?不同的格式有不同的库。 - Niki Yoshiuchi
1
这张图片是什么格式?BMP?PNG?JPEG? - Mark Byers
可能是JPG或BMP格式。它将从openGL中提取,所以我还不确定。这有关系吗?如果有,哪个更好? - Ahmad Farid
使用类似DevIL(http://openil.sourceforge.net/)的库。DevIL将图像数据加载到数组中,您可以使用类似ilGetPixels()的函数访问原始像素数据。DevIL还支持OpenGL。 - horseyguy
4个回答

15

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

5

无论是使用现有的库还是自己编写代码。通常第一种方法更好,因为图像文件格式往往比表面上看起来的要复杂,并且如果不小心可能会得到颠倒的图像或不正确的颜色分量顺序。

根据您的要求,您还可能需要考虑格式的功能。如果支持高动态范围很有趣,则OpenEXR是一个很好的选择;如果不是这样,它可能只是不方便,因为与其他程序相比,它的支持程度不如PNG等格式大。

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


我们使用libpng进行图像生成,它非常易于使用且是纯C++代码,因此无需处理糟糕的接口。 - Matthieu M.
1
@Matthieu M.:libpng肯定不是用“纯C ++”编写的。正如Laserallan链接页面上所述,它是用C89编写的。 - unwind

4

BMP是非常简单的。未压缩的BMP由一个头部、一些关于BMP的信息、颜色调色板(如果适用)以及逐像素的位图数据组成。编写自己的位图解析器是一项有趣的练习,尽管处理所有功能(8位、RLE压缩等)需要大量额外的工作。

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

应该使用哪种图像格式取决于应用程序。JPG具有很好的压缩率,但是压缩是有损的,这意味着你会丢失细节。如果图像带有文本,或者有大面积的纯色或边缘(比如漫画),这是不好的,你会看到明显的伪像。对于照片,JPG通常很好。PNG是一个不错的替代品,它们是压缩的,但是压缩是无损的。JPG通常比PNG小,两者都比BMP小。


4
如果你要处理图像,你应该考虑使用OpenCV库,它几乎具备了处理图像所需的所有功能。OpenCV 2.0在几个月前发布,非常适合用于C++开发。

8
仅仅读取图像而言,使用OpenCV可能过于浪费。 - Hannes Ovrén
是的,这是一个很大的库,我只是把它作为一个选项,如果他想做其他事情而不仅仅是读写,熟悉它会很有好处。 - rem7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接