CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

求位图单象素操作方法(无奈中)

楼主daotong(Day Day Up(天天向上))2006-03-07 13:55:55 在 VC/MFC / 图形处理/算法 提问

这几天刚学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

相关问题

  • 如何实现对象素的操作?
  • 对一个memory dc,可否直接取出地址进行象素操作?
  • listvew简单操作
  • 怎样使菜单条向右移动几个象素?
  • 设备坐标的单位是象素吧?
  • 高分求解简单每英寸长度的象素值
  • OpenGL中,如何获得一象素与单位长度的比例 既一象素等于X倍单位长度
  • 简单数据库操作
  • 简单的字符操作!
  • 简单操作问题

关键词

  • 函数
  • 象素
  • rowbytes
  • srcmask
  • srcbyte
  • mpalette
  • 操作
  • pix
  • rgb
  • cy

得分解答快速导航

  • 帖主:daotong
  • ydfivy

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo