遍历 24 位位图每个像素的问题。


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 个解决方案

#1


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 ++;
     }

#2


呵呵,我都注意到行只遍历了3分之1,怎么没想到每个像素长了3倍呢,呵呵,一语惊醒梦中人。



另外,256色图像像素的最高位是256。那24为图像像素的最高位是多少?是不是256×256?因为在线性变换中,256色图像中超过 255 的,全部为255,那24位的呢?

#3


三种颜色每种256。
好幸福,五星上将帮你咧,我只能……缄默!

#4


谢谢以上两位,不深感激。


#5


初学而已,交流交流

#6


再问一个问题,怎么样取的每个像素的 r g b 的值,是通过指向没个像素的指针来取得吗?lpSrc 为指向每个像素的指针。

#7


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);

     }
 }

#8


呵呵,得到颜色分量有3个宏的
GetRValue(), GetGValue(), GetBValue()

#9


大多数用楼上的楼上的方法
楼上的方法倒是没用过,能详尽些么?

#10


效率高那么一点点
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;
}

#11


噢,谢谢各位啦,太谢谢了。R  G  B 颜色的取得,我用seeingsea(看海听风) 方法,不错,我还以为要去从 DIB的 结构去分析,谢谢。不甚感激。

#12


接着问,呵呵。
如果我要去掉一副图像中所有的 某种颜色 颜色,是不是只要把每个像素  *lpSrc=0;或 *(lpSrc+1)…=0; 或 *(lpSrc+2)=0; 但这样好像不行啊,结果图像都变黑了。

另外,对于灰度直方图,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,那对24位位图来讲,直方图就是统计图像中 r g b 混合后的值吧?那横坐标不就是要255×255×255吗?

#13


上面没说清楚,比如去掉 Blue ,那就把每个像素  *lpSrc=0 。结果不行,变黑了。  *lpSrc 应该是该像素Rgb混合后的值吧?

#14


写回的时候不要写那种颜色

#15


“写回的时候不要写那种颜色”    不大懂什么意思,能否说清楚点?谢谢。

#16


如果我要去掉一副图像中所有的 某种颜色 颜色,是不是只要把每个像素  *lpSrc=0;或 *(lpSrc+1)…=0; 或 *(lpSrc+2)=0; 但这样好像不行啊,结果图像都变黑了。
----------------------------------------------------------------------------------------
我试了一下,这样的方法没问题呀,你的代码呢?

#17


我的代码
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; 
}

#18


像seeingsea(看海听风) 中写的
lpSrc=(unsigned char *)lpDIBBits+lLineBytes*(lHeight-1-i)+j*3; //乘3,
你好像没有乘3才变黑的吧
也是1/3都变黑了吧

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号