MFC的CImage图形处理

MFC的CImage图形处理CImage支持的图片格式有很多,像通常用的jpg,png,bmp,gif等都支持的不错。按照我们常用的图片处理需求,一般是:图片加载、图片指定到控件、图片绘制、图片修改、图片转换、(图片创建)

大家好,又见面了,我是你们的朋友全栈君。

参考: http://www.cnblogs.com/afarmer/archive/2012/03/31/2427273.html

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

CImage支持的图片格式有很多,像通常用的jpg, png, bmp,gif等都支持的不错。(CImage类基于GDI+,从VC.NET起引进,VC 6.0中没有。)

按照我们常用的图片处理需求,一般是:图片加载、图片指定到控件、图片绘制、图片修改、图片转换、(图片创建)

1. 图片加载 /打开

CImage加载/打开图片加载的方法有三个

a. 指定路径文件名加载 

CImage::load方法

可以根据load返回的结果来判定是否加载图片成功。

b. 指定resourceid加载,这种情况是把图片导入到了resource中,使用resource中定义的id加载

CImage::LoadFromResource

c. 绑定一个Bitmap,使用Attach方法,绑定一个Bitmap,这样就可以使用Cimage的许多方法了

CImage::Attach

使用这种方法记载的图形可以是DIB也或者是DDB图形,取决于绑定的HBITMAP是否是DIB图形,可以给予IsDIBSection判定(DIB: 设备无关图形  DDB:设备有关图形)

2. 图片指定到一个控件上

通常MFC内部控件使用到的是HBITMAP或CBitmap结构

我们打开图片结束后,可以使用

        image.Detach() 返回HBITMAP

        CDC::FromHandle(image.Detach()) 返回CBitamp

3. 图片绘制

      图片绘制到屏幕上,就需要相关的绘图设备了,需要和设备DC相关,所以几个绘图函数的第一个参数都是CDC*

      常用绘图函数:

CImage::Draw 绘制

CImage::StretchBlt 拉伸 (注意调用这个函数之前设置拉伸模式SetStretchBltMode)

CImage::AlphaBlend 混色

Cimage::TransparentBlt 透明绘制

CImage::MaskBlt 掩码绘制 Combines the color data for the source and destination bitmaps using the specified mask and raster operation. 

CImage::PlgBlt 平行四边形绘制 Performs a bit-block transfer from a rectangle in a source device context into a parallelogram in a destination device context. 

4. 图片修改

图片内容修改的方法有几种,

一种单个pixel修改,使用 

Cimage::SetPixelRGB

一种是批量修改,获取所有Pixel像素信息,批量的进行处理

CImage::GetBits获取到图片内存点的位置

使用这种方法的时候,需要考虑图形的结构,使用CImage::GetBPP获取每个像素点占几位,还需要使用CImage::GetPitch获取一行位的个数,根据GetPitch的正负值来判定GetBits获取到的head是首行的还是尾行的。

修改的话,就可以直接修改了,例如24位的数据,通常是BGR这种格式,每个Pixel像素第一个字节为Blue,第二个字节代表Green,第三个字节代表Red

5. 图片格式转换/保存

Cimage类提供了保存为其他格式的函数:

CImage::Save支持的参数有

The file type to save the image as. Can be one of the following:

  • ImageFormatBMP   An uncompressed bitmap image.

  • ImageFormatPNG   A Portable Network Graphic (PNG) compressed image.

  • ImageFormatJPEG   A JPEG compressed image.

  • ImageFormatGIF   A GIF compressed image.

6. 图片创建

除了通过Load方法创建一个图片之外,我们还可以通过Create方法创建一个图片,然后使用图片修改的方法来定义各个Pixel的信息

Cimage::Create

CImage::CreateEx

创建出的图片,使用4. 图片修改中的方法进行处理,然后可以使用Save方法保存起来

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147762.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html滚动字幕制作教程,dreamweaver教程:怎么制作网页滚动字幕[通俗易懂]

    html滚动字幕制作教程,dreamweaver教程:怎么制作网页滚动字幕[通俗易懂]滚动字幕在FrontPage的组件里有,但是FrontPage这个软件只能支持单行文字,一出现多行文字它就无能为力了,而且它只能支持一行滚动!(如果出现只能滚动一行的情况,解决办法是把这段代码嵌入到JavaScript的document.write里面,请看下面例的详细说明)Dreamweaver也只能用编写HTML代码的方法。所以强烈建议用记事本打开网页源代码来编辑。1.建立第一个滚动字幕。代码…

    2022年6月9日
    40
  • Mysql命令行修改字段类型

    Mysql命令行修改字段类型在做微信公众平台知识百科(账号:zhishiwiki)时,因为字段先前设计的不合理,导致内容装不下,因此需要修改其字段类型为text这里使用到了alter命令altertable表名称modify字段名称字段类型[是否允许非空];作者说:只有用到了,才能学

    2022年5月20日
    39
  • sendfile相关「建议收藏」

    sendfile相关「建议收藏」考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核(send)。而sendfile就将整个发送过程封装在一个系统调用中,避免了多次系统调用,避免了数据在内核空间

    2022年5月8日
    38
  • Copy Rounting (BAPI:BAPI_ROUTING_CREATE)

    Copy Rounting (BAPI:BAPI_ROUTING_CREATE)FORMfrm_uploadUSINGvalue(ps_i_tabindex)LIKEsy-tabixvalue(pc_i_fieldname)TYPEslis_fieldnameCHANGING

    2022年7月24日
    11
  • Torchvision transforms 总结

    Torchvision transforms 总结一.torchvision.transformsTransfoms是很常用的图片变换方式,可以通过compose将各个变换串联起来**1.classtorchvision.transforms.Compose(transforms)**这个类将多个变换方式结合在一起参数:各个变换的实例对象举例:transforms.Compose([ transforms.Center…

    2022年6月24日
    47
  • 常驻内存以及如何避免内存泄漏

    常驻内存以及如何避免内存泄漏

    2022年2月13日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号