CBitmap的使用
CBitmap的使用
来来叔叔 发表于4个月前
CBitmap的使用
  • 发表于 4个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建、图像数据的获取等功能。虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的。很多人可能会采用一些现成的CDib类进行位图的读取与处理,我觉得必要性不大。因为他们完成的功能差不多。

    以下假设定义了数据成员:

    CBitmap m_bitmap;

(1) 位图的读取

 

void LoadImage(CString fileName)
{
HBITMAP m_hBitmap;//位图句柄
BITMAP bm;//存放位图信息的结构

   m_hBitmap = (HBITMAP)::LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   //装载位图
   if(m_bitmap.m_hObject)
      m_bitmap.DeleteObject();
   m_bitmap.Attach(m_hBitmap);//将句柄与CBitmap关联起来
   m_bitmap.GetBitmap(&bm);
   height = bm.bmHeight;//图像的宽高
   width = bm.bmWidth;

widthBytes=bm.bmWidthBytes;//图像一行数据所占的字节数

}


(2) 位图的显示

在OnDraw()或OnPaint()函数中调用:

//dx0,dy0,dx,dy为显示目标位置的坐标和大小,

//sx0,sy0,sx,sy为图像要显示部分的起始坐标和大小

void DrawImage(int dx0, int dy0, int dx, int dy, int sx0, int sy0, int sx, int sy)

{ if(!m_bitmap.m_hObject) 
   return;

CClientDC dc(this);

CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pbmpOld = memDC.SelectObject(&m_bitmap);

dc.SetStretchBltMode(COLORONCOLOR);//设置拉伸模式,否则图像会不清晰
dc.StretchBlt(dx0,dy0,dx,dy,&memDC,sx0,sy0,sx,sy,SRCCOPY);//绘制图像
memDC.SelectObject(pbmpOld);
memDC.DeleteDC();

}


 

(3) 位图数据的获取

以灰度转化为例:

int size=height*widthBytes;
BYTE *lpBits=new BYTE[size];
m_bitmap.GetBitmapBits(size,lpBits);//得到RGB数据

BYTE *lpGray=new BYTE[height*width];

int R, G, B;

for(int i=0;i<height;i++)

   for(int j=0;j<width;j++)

   {

      B=lpBits[i*widthBytes+j*4];

      G=lpBits[i*widthBytes+j*4+1];

      R=lpBits[i*widthBytes+j*4+2];

      lpGray[i*width+j]=(B+G+R)/3;//转化为灰度

   }

...

delete []lpBits;

delete []lpGray;

共有 人打赏支持
粉丝 0
博文 100
码字总数 55732
×
来来叔叔
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: