我一直在寻找C ++中的代码,该代码可让我获取png文件中所有像素的RGB值。
因此,我在互联网上进行了大量搜索,找到了执行此操作的不同方式,例如使用libpng,OpenCV,Magick ++,CImg等。我只是决定使用CImg(主要是因为我不知道如何使用OpenCV,尽管我在Code :: Blocks中搜索了很多有关如何安装和使用它的内容,并且它与mingw64有关,而mingw64是我从Sorceforge下载的安装程序,在下载某些文件的过程中一直给我错误,以及有关他们其余的我只是找不到与Code :: Blocks兼容的适当的头文件(如Magick ++。h)...因此,如果您认为其中一些会比CImg.h更好和更简单,那么我d如果您提供给我标题的下载链接或任何其他必要的东西,请多谢您)
所以这是我在Cimg中找到的代码:
#include <windows.h>
#include <iostream>
using namespace std;
#include <CImg.h>
using namespace cimg_library;
int main()
{
CImg<unsigned char>src("twittericon.png");
int width = src.width();
int height = src.height();
cout << width << "x" << height << endl;
for (int r = 0; r < height; r++)
for (int c = 0; c < width; c++)
cout << "(" << r << "," << c << ") ="
<< " R" << (int)src(c,r,0,0)
<< " G" << (int)src(c,r,0,1)
<< " B" << (int)src(c,r,0,2) << endl;
return 0;
}
但是问题是运行该程序后,它给了我错误:CImg :: load():无法识别文件'twittericon.png'的格式
该怎么办?
顺便说一句,您是否知道任何更好的方法来读取png文件的这些RGB值?如果这样做,还可以请我提供一些说明吗?谢谢。
获取PNG
文件中RGB像素值的方法有很多,最好的方法取决于您的实际使用情况。
选项1
如果您有一个或两个PNG
文件,并且只想一次轻松获得RGB像素,那么我建议您安装任何已经提供链接的现成ImageMagick二进制文件。然后,我们可以PNG
在“终端”或“命令提示符”中的命令行制作这样的测试文件:
convert xc:red xc:lime xc:blue +append \( xc:cyan xc:magenta xc:yellow +append \) -append image.png
它看起来像这样(略小):
(我认为您在上述命令中省略了Windows下的反斜杠)
好的,现在您想查看RGB值,因此可以将文件转储为文本:
convert image.png -depth 8 txt:
样本输出
# ImageMagick pixel enumeration: 3,2,65535,srgb
0,0: (65535,0,0) #FF0000 red
1,0: (0,65535,0) #00FF00 lime
2,0: (0,0,65535) #0000FF blue
0,1: (0,65535,65535) #00FFFF cyan
1,1: (65535,0,65535) #FF00FF magenta
2,1: (65535,65535,0) #FFFF00 yellow
或者,您可以将文件转换为ASCII模式下NetPBM的古老(但精湛)NetPBM格式的Wikipedia描述:
convert image.png -compress none image.pnm
现在,您将获得一个像这样的文件,您可以轻松阅读:
P3 # PPM in ASCII mode
3 2 # width=3 height=2
255 # 8-bit
255 0 0 0 255 0 0 0 255
0 255 255 255 0 255 255 255 0
如果省略,-compress none
则将获得相同的文件,但是RGB数据将以8位无符号二进制格式出现,因此整个文件在C / C ++中非常易于读取。实际上,CImg仍然知道如何读取/写入这些内容。
因此,可以将可能要访问的任何图像(TIF,BMP,JPEG,GIF)PPM
预先转换为NetBM文件,并仅PPM
使用CImg中的内置例程读取和写入文件。任务完成!
选项2
在下一级别,您可以从ImageMagick网站上的预构建二进制文件安装ImageMagick,然后使用CImg。然后,CImg将定位ImageMagick的程序,该程序使用该程序来转换它无法代表自己读取的任何内容。这样,您可以立即免费访问ImageMagick知道的大约200多种格式。convert/magick
选项3
或者,您可以构建和安装libpng
,然后在使用CImg编写代码时,先定义一个宏,然后再包含CImg.h
它,该宏libpng
用于读取和写入PNG文件。
当您只允许ImageMagick完成所有工作时,这将是一个很大的麻烦,最后,您只能获得PNG
支持而不是200多种格式的所有工作。
这种情况如下所示:
#define cimg_use_png 1
#include "CImg.h"
...
...
您将使用:
c++ -I CIMG_DIRECTORY -L LIBPNG_DIRECTORY -lpng -lz
我做了另一个答案,使用此选项libjpeg
获取CIMg以读取和写入JPEG。我只能说这是完全的痛苦-答案在这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句