Visual c++ 图像处理以256色位图为例作处理,我想把程序该成对24位位图的处理,但在遍历每个像素时有点问题。
lLineBytes=WIDTHBYTES(lWidth*8); 这个是书上的计算256色图像的每行大小,
WIDTHBYTES 原型为 #define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4),这是为了得到行大小是 4 的倍数(书上注解)
那如果我要处理 24 位位图,每行的大小是不是就是 lLineBytes=WIDTHBYTES(lWidth*24);
遍历过程(线性变换为例)
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{ lpSrc=(unsigned char *)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
fTemp=fA*(*lpSrc)+fB;
*lpSrc=(unsigned char)(fTemp+0.5);
}
}
lpDIBBits 为指向 dib位图的首指针。
但是,这样并不能遍历行,处理结果,行只遍历了3分之1,高倒是遍历了。也就是之只处理了图像的左边的3分之1。
另外,256色图像像素的最高位是256。那24为图像像素的最高位是多少?是不是256×256?因为在线性变换中,256色图像中超过 255 的,全部为255,那24位的呢?
谢谢指教。
18 个解决方案
Each pixel is three bytes long: So you need to do:
lpSrc = (unsigned char *)lpDIBBits+lLineBytes*(lHeight-1-i);
for(j=0;j<lWidth * 3;j++)
{ fTemp=fA*(*lpSrc)+fB;
*lpSrc=(unsigned char)(fTemp+0.5);
lpSrc ++;
}
呵呵,我都注意到行只遍历了3分之1,怎么没想到每个像素长了3倍呢,呵呵,一语惊醒梦中人。
另外,256色图像像素的最高位是256。那24为图像像素的最高位是多少?是不是256×256?因为在线性变换中,256色图像中超过 255 的,全部为255,那24位的呢?
三种颜色每种256。
好幸福,五星上将帮你咧,我只能……缄默!
再问一个问题,怎么样取的每个像素的 r g b 的值,是通过指向没个像素的指针来取得吗?lpSrc 为指向每个像素的指针。
24位图中,每个象素使用3个字节记录颜色,三个字节分别是R,G,B三种颜色的分量。所以要取得三种颜色分量,只需如此:
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char *)lpDIBBits+lLineBytes*(lHeight-1-i)+j*3; //乘3,
unsigned char blue = *lpSrc; //颜色是以B,G,R 顺序存放的
unsigned char green = *(lpSrc+1);
unsigned char red = *(lpScr+2);
}
}
呵呵,得到颜色分量有3个宏的
GetRValue(), GetGValue(), GetBValue()
大多数用楼上的楼上的方法
楼上的方法倒是没用过,能详尽些么?
效率高那么一点点
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (lHeight - 1);
for(i = lHeight - 1;i > 0;i--)
{
for(j = 0;j < lWidth; j++)
{
fTemp=fA*(*lpSrc)+fB;
*lpSrc=(unsigned char)(fTemp+0.5);
fTemp=fA*(*(lpSrc + 1))+fB;
*(lpSrc + 1)=(unsigned char)(fTemp+0.5);
fTemp=fA*(*(lpSrc + 2))+fB;
*(lpSrc + 2) = (unsigned char)(fTemp+0.5);
lpSrc += 3;
}
lpSrc -= lLineBytes + 3 * lWidth;
}
噢,谢谢各位啦,太谢谢了。R G B 颜色的取得,我用seeingsea(看海听风) 方法,不错,我还以为要去从 DIB的 结构去分析,谢谢。不甚感激。
接着问,呵呵。
如果我要去掉一副图像中所有的 某种颜色 颜色,是不是只要把每个像素 *lpSrc=0;或 *(lpSrc+1)…=0; 或 *(lpSrc+2)=0; 但这样好像不行啊,结果图像都变黑了。
另外,对于灰度直方图,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,那对24位位图来讲,直方图就是统计图像中 r g b 混合后的值吧?那横坐标不就是要255×255×255吗?
上面没说清楚,比如去掉 Blue ,那就把每个像素 *lpSrc=0 。结果不行,变黑了。 *lpSrc 应该是该像素Rgb混合后的值吧?
“写回的时候不要写那种颜色” 不大懂什么意思,能否说清楚点?谢谢。
如果我要去掉一副图像中所有的 某种颜色 颜色,是不是只要把每个像素 *lpSrc=0;或 *(lpSrc+1)…=0; 或 *(lpSrc+2)=0; 但这样好像不行啊,结果图像都变黑了。
----------------------------------------------------------------------------------------
我试了一下,这样的方法没问题呀,你的代码呢?
我的代码
int i,j;
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
*lpSrc=0;
}
像seeingsea(看海听风) 中写的
lpSrc=(unsigned char *)lpDIBBits+lLineBytes*(lHeight-1-i)+j*3; //乘3,
你好像没有乘3才变黑的吧
也是1/3都变黑了吧