作者pizza0117 (阿水~*)
看板C_and_CPP
標題Re: [語法] pixel的值放入陣列
時間Fri Nov 6 10:50:09 2009
※ 引述《ioioioioioio (討戰是興趣)》之銘言:
: ※ 引述《waquey (請支持3/27"花蝴蝶")》之銘言:
: : As title
: : 如果我今天可以知道一張圖的 Height 跟 width
: : 然後一個一個去擷取它的pixel值
: : 要怎麼宣告陣列
: : new DWORD[][]!? (裡面想放Height跟width 可是都會有錯)
: : 有試過給定很大的數字 Ex: int src[4000][4000]
: : 但似乎不是一個很好的方法
: : 還有就是一個圖的pixel值都很大
: : 用dword陣列的儲存方法對嗎?
: unsigned char *data = NULL;
: //RGB data
: data = (unsigned char *)malloc(sizeof(unsigned char) * height * width * 3);
: //use for-loop
: *(data + (i * width + j) * 3 + 2) = R;
: *(data + (i * width + j) * 3 + 1) = G;
: *(data + (i * width + j) * 3 + 0) = B;
: 我是這樣做的 有錯請高手指正~
這樣做會多做很多乘法
假設wh=320 240
當i=0的時候,要取第一個row的所有值(j=0~320)
則必須每個點都做一次i*w的運算,但實際上乘一次就好
既然是影像處理,我就用簡單的灰階來舉例
#define unsigned char BYTE
#define W 320
#define H 240
#define BPP 3 //bytes per pixel (3 => R,G,B)
方法一
宣告動態三維陣列,方便使用,但三維動態空間讀取速度較慢
int i,j;
//create buffer
BYTE ***image = new BYTE**[H]
for(i=0; i<H; i++)
image[i] = new BYTE*[W];
for(i=0; i<H; i++)
for(j=0; j<W; j++)
image[i][j] = new BYTE[BPP];
get_image_source(image);
//processing
for(i=0; i<H; i++)
for(j=0; j<W; j++)
image[i][j][0] = image[i][j][1] = image[i][j][2] =
(image[i][j][0] + image[i][j][1] + image[i][j][2]) / 3 ;
方法二
宣告一維連續記憶體,使用公式找到pixel位置,演算複雜時撰寫複雜,大量乘法增加負擔
#define GetR(i,j) ((i*W+j)*BPP+2)
#define GetG(i,j) ((i*W+j)*BPP+1)
#define GetB(i,j) ((i*W+j)*BPP+0)
int i,j;
//create buffer
BYTE *image = new BYTE[H * W * BPP]
get_image_source(image);
////processing
for(i=0; i<H; i++)
for(j=0; j<W; j++)
image[GetB(i,j)] = image[GetG(i,j)] = image[GetR(i,j)] =
(image[GetB(i,j)] + image[GetG(i,j)] + image[GetR(i,j)]) / 3 ;
方法三
宣告一維陣列,使用指標,使用加法取代乘法
int i,j;
int EffW = W * BPP;
//create buffer
BYTE *image = new BYTE[H * W * BPP];
get_image_source(image);
//processing
BYTE *p_image = image;
for(i=0; i<H; i++, p_image+=EffW)
for(j=0,k=0; j<W; j++,k+=BPP)
p_image[k] = p_image[k+1] = p_image[k+2] =
(p_image[k] + p_image[k+1] + p_image[k+2]) / 3 ;
給大家參考一下~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.51.217
→ pizza0117:忘了提一下.我是推薦用方法三~ 11/06 10:52
推 waquey:謝謝 11/06 11:55