作者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
1F:→ pizza0117:忘了提一下.我是推荐用方法三~ 11/06 10:52
2F:推 waquey:谢谢 11/06 11:55