如何以十六进制颜色输出图像每个像素的所有颜色(6digit)

时间:2017-04-04 03:37:37

标签: c++ image-processing

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

2 个答案:

答案 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

这里放大了:

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