cbitmap 获取RGB CBitMap的用法

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

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;

目录
相关文章
|
Kubernetes Cloud Native 网络协议
云原生下的开发测试实践
近日,阿里巴巴旗下企业级一站式DevOps平台——阿里云·云效正式开启公测,为了让广大开发者更好地了解“新云效”,《云效说码》栏目特别策划了《为云研发而生 解密云效公测版专场》系列分享,邀请了多位阿里巴巴技术专家通过视频直播的方式与大家在线交流,分享云效产品的亮点和技术优势。本系列分享共有五节内容,本文整理自阿里巴巴技术专家林帆(金戟)和郑云龙(砧木)的视频分享《云原生下的开发测试》。
1733 91
云原生下的开发测试实践
|
编解码 自然语言处理 算法
开源版图生视频I2VGen-XL:单张图片生成高质量视频
VGen是由阿里巴巴通义实验室开发的开源视频生成模型和代码系列,具备非常先进和完善的视频生成系列能力
|
编解码 Linux C语言
探索C++与Live555实现RTSP服务器的艺术(一)
探索C++与Live555实现RTSP服务器的艺术
1019 1
|
算法 安全 量子技术
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
652 0
|
3月前
|
自然语言处理 数据可视化 API
解锁 Qwen3 的Agent能力,CookBook来咯!
Qwen3系列模型具备强大Agent能力,但从模型到Agent仍存技术难题。为此,我们推出基于Qwen-Agent框架的3个CookBook示例,展示如何让Qwen3丝滑调用MCP Server全过程。不论是本地部署还是API调用模型,开发者均可通过Qwen-Agent完成复杂任务。CookBook包括自然语言驱动数据库操作、云端高德API地理服务及文档转思维导图等功能。Qwen-Agent封装了工具调用模板和解析器,原生支持MCP协议,大幅降低开发成本。欢迎体验并反馈。
406 0
|
11月前
|
数据采集 搜索推荐 前端开发
|
Java 编译器 数据库
异步日志方案——spdlog
异步日志方案——spdlog
|
Linux Shell 开发者
关于Linux上的$ORIGIN解说
适当应用 `$ORIGIN`,你的应用程序将更加灵活,更易于分发和部署。
452 5
|
Linux 数据处理
Linux命令iconv:字符编码转换的利器
`iconv`是Linux下的字符编码转换工具,支持多种编码如UTF-8、ISO-8859-1等。它允许用户指定源(-f)和目标(-t)编码,转换文件或输出到指定文件(-o)。使用`-l`可列出所有支持的编码。示例:将UTF-8文件转为ISO-8859-1编码:`iconv -f UTF-8 -t ISO-8859-1 input.txt -o output.txt`。在转换前确认源编码,测试小样本,备份数据,并注意特殊字符处理。
|
机器学习/深度学习 人工智能 自然语言处理
大模型是如何理解人类语言的?
大模型是如何理解人类语言的?
391 0