2017-04-04 115 views
-1

如何使用C++在十六进制代码(如(#FFFFFF))中打印图像中的所有颜色? 什么样的库,我需要为了逐像素提取所有的颜色像素?以及如何使用该库循环到所有像素的代码? 对不起,我的英语不好。 谢谢。如何以十六进制颜色(6位数)输出图像的每个像素的所有颜色

+0

做什么? 'long color = pixelmap [pixel]; std :: cout << std :: hex << color;' – user3811082

+0

@ user3811082如何将图像加载到C++? – owenizedd

+0

@ user3811082我想知道每个像素整个图像的十六进制值 – owenizedd

回答

0

如果我可以大胆地引用艾萨克·牛顿爵士,在十六进制转储的图像的像素的最简单方法是“站在肩上的巨人“。在这种情况下,巨人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 

这被放大:

enter image description here

和像这样运行程序 - 希望你可以看到十六进制从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 
+0

非常感谢! – owenizedd

0

所有你需要的是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 
    } 
} 
+0

小心! OpenCV默认使用BGR,因此索引0给出蓝色组件,1给出绿色,2给出红色。 – Baiz

+0

谢谢,我已更改代码 – user3811082