求位图单象素操作方法(无奈中)
这几天刚学vc的图像编程,涉及到图像特征的提取,其中要用到单个象素的颜色值,但是翻阅了一堆书籍,查了上百个网站,始终没发现提及单象素操作的内容,真是郁闷到家了。
找了些算法,动不动就几百行Win32的API(能力有限,理解不透彻),似乎故意卖弄自己的编程能力;找了几个bmp的操作类库,涉及象素操作的没有一个能编译成功。各位有能力的帮帮忙,给个简单易行的算法,只要能取位图任意象素的颜色值就可以,感激不禁。
问题不难,但是我无从下手.........................
问题点数:40、回复次数:4Top
1 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-07 14:17:59 得分 0
http://topic.csdn.net/t/20020602/11/772495.html
你需要知道bmp文件的格式,加载后就可以获得数据,直接在里面操作
然后用DrawDibDraw的方式绘制就是了Top
2 楼ydfivy(我就是一送外卖的)回复于 2006-03-07 14:18:38 得分 40
COLORREF
CDIB::GetPixel(int x,int y)
{
if(x < 0 || y < 0)
return -1;
CSize size = GetDimensions();
if(x >= size.cx)
return -1;
if(y >= size.cy)
return -1;
int depth = GetDepth();
int rowBytes = GetRowBytes();
BYTE *bits = (BYTE *)GetBits();
switch(depth){
case 1:{
BYTE *srcByte = bits + ((size.cy - y - 1) * rowBytes) + (x / 8);
int srcS = x % 8;
BYTE srcMask = 0x80 >> srcS;
return ((*srcByte) & srcMask) ? RGB(0,0,0) : RGB(255,255,255);
}
case 8:{
if(mPalette){
BYTE *srcByte = bits + ((size.cy - y - 1) * rowBytes) + x;
PALETTEENTRY e;
mPalette->GetPaletteEntries(*srcByte,1,&e);
return UTools::PALETTEENTRYtoCOLORREF(e);
}
else
return RGB(0,0,0);
}
case 24:{
BYTE *pix = bits + ((size.cy - y - 1) * rowBytes) + x * 3;
BYTE b = *pix++;
BYTE g = *pix++;
BYTE r = *pix;
return RGB(r,g,b);
}
default:
return -1;
}
return -1;
}
这是我图形像素操作时用的一个函数.
你可以参考一下.实际上就是根据保存位图数据的指针,再根据行,列,算出位置,再根据位图是多少位,来取RGB分量的值.Top
3 楼daotong(Day Day Up(天天向上))回复于 2006-03-08 09:41:52 得分 0
3楼的朋友给的应该是一个自定义类的函数,中间的几个函数调用有的不太清楚啊。
int rowBytes=GetRowBytes(); //功能是什么,获得每行的位数,还是每行的字节数
BYTE *bits=(BYTE*)GetBits(); //应该是获得象素起始点的指针,我就是要的这个,但只
//给了函数,没给实现,对我来说剩下的不重要......
BYTE srcMask=0x80>>srcS; //这个移位我不太懂哦
//下边这句也不大懂,*srcByte和srcMask进行与位操作?怎么还用到这个:" ? : "操作符
return ((*srcByte)&srcMask)?RGB(0,0,0):RGB(255,255,255);
if(mPalette) //这个mPalette想干什么呢,什么意思
return UTools::PALETTEENTRYtoCOLORREF(e);//不太清楚哦
是在汗颜,这么多不懂的东西,还望各路高手指点一下Top
4 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-08 10:29:08 得分 0
你只要肯花1个小时的时间,仔细的看一下bmp文件的磁盘存储格式,就什么问题都没有了
不能老等现成的Top




