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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webstorm最新激活码2021【2021最新】

    (webstorm最新激活码2021)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    61
  • php注册登录页面完整代码_用户登录注册代码

    php注册登录页面完整代码_用户登录注册代码先看演示~示例图:Ps.本人有点懒哈~就输出个成功算了吧~PHP实现登录注册index.php(首页)login.php(登录)register.php(注册)代码里面注释写很详细了哦~废话不多说直接上代码~index.php代码:<!DOCTYPEhtml><html><head><metacharset=”utf-8″><metaname=”viewport”content=”width=

    2022年10月3日
    3
  • uC/os内存优化——TLSF算法

    uC/os内存优化——TLSF算法需求uC/os内存管理机制为内存块形式,用户申请内存是需要自己指定内存区内内存块数和内存块大小,看起来很灵活,实际上很不方便,需要使用者记住内存块大小,自己维护内存区,给使用者增加了负担。TLSF算法能够满足实时性的要求,并且可有效的较小内部碎片。TLSF作为分离式空闲链表算法(SegregatedFreeLists)的拓展–将相似的空闲块利用数组或者二叉树进行管理从而使响应时间与空…

    2022年6月15日
    29
  • 2021版idea激活码99年【永久激活】

    (2021版idea激活码99年)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    282
  • Spring bean的生命周期[通俗易懂]

    Spring bean的生命周期[通俗易懂]Spring bean的生命周期

    2022年6月17日
    63
  • 详解 Java 内部类

    详解 Java 内部类前言内部类在Java里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于Java中内部类的相关知识点和一些使用内部类时需要注意的点。从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看:普通内部类这个是最常见的内部类之一了,其定义也很简单,在一个类里面作为类的一个字段直接定义就可以了,例:pub…

    2022年10月11日
    3

发表回复

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

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