如何使用C ++以十六进制代码(如#FFFFFF)打印图像中的所有颜色? 为了逐个像素地提取所有颜色,我需要什么样的库?以及如何编码使用该库逐个循环到所有像素代码? 对不起我的英文不好。 感谢。
答案 0 :(得分:1)
您需要的只是OpenCV。要加载图片,请获取像素并将其写入十六进制值:
#include <opencv\cv.h>
//....
Mat img = imread(filename);
for (int x = 0; x < img.cols; x++) {
for (int y = 0; y < img.rows; y++) {
Vec3b color = img.at<Vec3b>(y, x);
cout << std::hex << color.val[0]; //blue
cout << std::hex << color.val[1]; //green
cout << std::hex << color.val[2]; //red
//or
int colorint = img.at<int>(y, x);
cout << std::hex << colorint; //redgreenblue
}
}
答案 1 :(得分:0)
如果我可以如此大胆地引用艾萨克·牛顿爵士,那么以十六进制方式转储图像像素的最简单方法就是&#34;站在巨人的肩膀上&#34; 。在这种情况下,巨人是 ImageMagick ,它安装在大多数Linux发行版上,可以免费使用,适用于macOS和Windows。
在命令行中,只需输入:
convert picture.jpg txt:
<强>输出强>
# ImageMagick pixel enumeration: 300,168,65535,srgb
0,0: (64507,56283,34952) #FBDB88 srgb(251,219,136)
1,0: (65535,58596,37779) #FFE493 srgb(255,228,147)
2,0: (65535,56026,36237) #FFDA8D srgb(255,218,141)
3,0: (62708,51400,33153) #F4C881 srgb(244,200,129)
4,0: (62965,49858,33153) #F5C281 srgb(245,194,129)
5,0: (63222,48830,33153) #F6BE81 srgb(246,190,129)
6,0: (63479,48316,33924) #F7BC84 srgb(247,188,132)
7,0: (64250,48830,34952) #FABE88 srgb(250,190,136)
第二个最简单的选项是CImg
C ++库,您可以从here获取该库。我相信它比OpenCV
要简单得多,例如,在Raspberry Pi上占用大约1GB的空间并且需要一个多小时才能构建,而CImg
是一个包含头文件的单个文件。在你的代码中没有需要安装的库,这可以做你想要的。
////////////////////////////////////////////////////////////////////////////////
// main.cpp
//
// CImg example of dumping pixels in hex
//
// Build with: g++-6 -std=c++11 main.cpp -lpng -lz -o main
////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#define cimg_use_png // Do this if you want CImg to process PNGs itself without resorting to ImageMagick
#define cimg_use_jpeg // Do this if you want CImg to process JPEGs itself without resorting to ImageMagick
#define cimg_use_tiff // Do this if you want CImg to process TIFFs itself without resorting to ImageMagick
#define cimg_use_curl // Do this if you want CImg to be able to load images via a URL
#define cimg_display 0 // Do this if you don't need a GUI and don't want to link to GDI32 or X11
#include "CImg.h"
using namespace cimg_library;
using namespace std;
int main() {
// Load image
CImg<unsigned char> img("input.png");
// Get width, height, number of channels
int w=img.width();
int h=img.height();
int c=img.spectrum();
cout << "Dimensions: " << w << "x" << h << " " << c << " channels" <<endl;
// Dump all pixels
for(int y=0;y<h;y++){
for(int x=0;x<w;x++){
char hex[16];
sprintf(hex,"#%02x%02x%02x",img(x,y,0),img(x,y,1),img(x,y,2));
cout << y << "," << x << " " << hex << endl;
}
}
}
我们可以通过使用 ImageMagick 创建一个红蓝色的小渐变图像来测试它:
convert -size 1x10 gradient:red-blue input.png
这里放大了:
并运行这样的程序 - 希望你能看到十六进制从ff0000
(全红)到0000ff
(全蓝):
./main
示例输出
Dimensions: 1x10 3 channels
0,0 #ff0000
1,0 #8d0072
2,0 #1c00e3
3,0 #aa0055
4,0 #3800c7
5,0 #c70038
6,0 #5500aa
7,0 #e3001c
8,0 #72008d
9,0 #0000ff