看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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