2017-04-04 29 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

相關問題