文档章节

CBitmap的使用

来来叔叔
 来来叔叔
发布于 2017/08/04 23:55
字数 418
阅读 6
收藏 0
 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
作品 0
广州
高级程序员
私信 提问
桌面精灵制作解析

最近一直在做一个涉及到很多Windows Region区域处理的项目,在开展的过程中,另我想起了几年前看到的一篇讲制作桌面精灵的文章([url]http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls...

余二五
2017/11/16
0
0
CBitmap::CreateBitmap

初始化具有指定的宽度、高度和位组合的设备相关的内存位图。 BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits ); 参数 nWidth 指定宽度 (以...

Amamatthew
2014/06/16
0
0
MFC中的位图操作

MFC中的位图操作,涉及三个概念:CBitmap,HBitmap,BITMAP. 1.BITMAP是位图的基本数据结构,封装位图信息,包括颜色,大小,位值,数据等 typedef struct tagBITMAP{ int bmType; int bmWidth; //宽 ...

Chinayu2014
2017/10/20
0
0
OpenCV用GDI或者GDI+函数对IplImage图像处理

(1 )IplImage -> Bitmap and Bitmap -> IplImage IplImage *img ;Bitmap bitmap( 20 ,20 ,PixelFormat24bppRGB ) ;Graphics pGra( & bitmap) ;HDC hdc = pGra ->GetHDC() ;CvImage cvimg ;cv......

moki_oschina
2016/04/09
30
0
VC++工具栏显示真彩色位图资源

问题: 论坛中有很多人提出:基于Windows的程序如资源管理器(Explorer.exe),IE等都能显示出漂亮的工具栏图像和图标。但是,用MFC开发的应用程序一般都只能显示16色的工具栏图像和列表视图...

长平狐
2013/12/25
215
0

没有更多内容

加载失败,请刷新页面

加载更多

Dubbo下一站:Apache顶级项目

摘要: 导读: 近日,在Apache Dubbo开发者沙龙杭州站的活动中,阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。...

阿里云云栖社区
6分钟前
0
0
Vim中快捷键命令介绍

map命令简介 map是一个映射命令,将常用的很长的命令映射到一个新的功能键上。map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。Vim中有五种映射存在: 用于普通模式:...

陶小陶
10分钟前
0
0
结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景: 数据库连接信息 限流阈值和降级开关 流量的动态调度 上一篇:Nacos帮我解决了什么问题? 数据...

阿里云官方博客
12分钟前
0
0
Docker | 采用镜像alpine缺少时区解决方法

加入: RUN apk --update add tzdata当然也可以安装其他的如 procps, php 等

云迹
13分钟前
0
0
在Python中调用Java扩展包HanLP测试记录

最近在研究中文分词及自然语言相关的内容,关注到JAVA环境下的HanLP,HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义...

左手的倒影
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部