CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
如何從ptr
獲得rgb
?如何通過cimg獲取rgb值?
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
如何從ptr
獲得rgb
?如何通過cimg獲取rgb值?
從the CImg documentation - 120頁上的第34頁和第8.1.4.16節上6.13 - 它看起來像data
方法可以採取四個參數:X,Y,Z,和c:
T* data(const unsigned int x, const unsigned int y = 0,
const unsigned int z = 0, const unsigned int c = 0)
...其中c
涉及顏色通道。我在猜測,如果你的圖像確實是一個RGB圖像,那麼對於c
使用0,1或2的值將給出在給定的x, y
位置處的紅色,綠色和藍色分量。
比如:
unsigned char *r = src.data(10, 10, 0, 0);
unsigned char *g = src.data(10, 10, 0, 1);
unsigned char *b = src.data(10, 10, 0, 2);
(!但是,這只是一個猜測)
編輯:
看起來也有一個爲CIMG,在一個工程的運營商()類似的方式:
unsigned char r = src(10, 10, 0, 0);
測試在Ubuntu 1 0.04保存爲test.png
一個手工製作的3x3 RGB圖像:
sudo apt-get install cimg-dev
源文件cimg_test.cpp
:
#include <iostream>
using namespace std;
#include <CImg.h>
using namespace cimg_library;
int main()
{
CImg<unsigned char> src("test.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;
}
編譯並運行:
g++ cimg_test.cpp -lX11 -lpthread -o cimg_test ./cimg_test 3x3 (0,0) = R0 G0 B0 (0,1) = R255 G0 B0 (0,2) = R0 G255 B0 (1,0) = R0 G0 B255 (1,1) = R128 G128 B128 (1,2) = R0 G0 B128 (2,0) = R128 G0 B0 (2,1) = R0 G128 B0 (2,2) = R255 G255 B255
它的工作原理。
如何使它適用於灰度圖像? – wamp 2010-07-23 03:02:38
@wamp:src(c,r,0,0)是灰度圖像(r,c)像素的0-255值。 – 2010-07-23 18:17:38
@wamp:我不知道CIMG但在RGB灰度圖像有:
R = G = B
和在CMYK:
C = M = Y = 0
K =
亮度所以你甚至不需要一個函數,該函數......
這是不正確的。儘管您可以使用僅使用R = G = B的RGB格式保存圖像,但您將使用必要的3倍數據來存儲圖像。這就是爲什麼只有一個灰度格式的圖像只能保存一個通道。 – 2015-07-06 19:40:01
訪問數據最簡單的方法是用()
操作:
unsigned char r = img(10,10,0,0);
unsigned char g = img(10,10,0,1);
unsigned char b = img(10,10,0,2);
你可能會打,因爲CIMG存儲混亂的原始數據非交錯。即原始數據存儲的R1, R2, ..., G1, G2, ..., B1, B2, ...
代替R1, G1, B1, R2, G2, B2, ...
見:http://cimg.eu/reference/group__cimg__storage.html
.data()
剛剛返回一個指針,所以訪問數據直接作爲上面你會做:
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
unsigned char r = ptr[0];
unsigned char g = ptr[0+width*height];
unsigned char b = ptr[0+2*width*height];
測試,但失敗... – user198729 2010-07-20 16:31:24
有你嘗試過operator(),例如unsigned char r = src(10,10,0,0); – 2010-07-20 17:10:57
真的取決於你的圖像,但是rg和b通道是分開的,所以讀取一個通道會得到紅色的值(即帶有jpg圖像的通道0),通道1會讓你變綠,通道2會讓你藍色...這是一個例子,它與一個浮動圖像在文檔中的8.1.4.9 ..更改爲無符號字符浮動,它應該工作...繼承人的一個例子 unsigned char r = src.data( 10,10,0,0); unsigned char g = src.data(10,10,0,1); unsigned char b = src.data(10,10,0,2); – 2010-07-20 17:37:49