最近对一个项目中的软件进行了一些界面性能的改进,我主要是用CImage替代了一些以前用GDI+实现的内容。

使用中发现CImage对半透明图片的绘制,是有问题的,半透的部分总是显示一些很奇怪的内容(颜色很突兀)。

后来经过仔细追查,终于找到了原因。

原因是这样的,CImage的默认绘制算法,对于目标点的计算算法是这样的:

displayColor = sourceColor + backgroundColor × (255 – alpha) / 255

而GDI+的绘制算法,对于目标点的计算算法是这样的:

displayColor = sourceColor × alpha / 255 + backgroundColor × (255 – alpha) / 255

很明显GDI+的算法效果要合理的多。如果按照CImage的算法处理,会有很多像素的RGB分量会超过255,和我看到的一些很奇怪的内容非常吻合。

按照以上算法,只需要对CImage的RGB分别乘以alpha再除以一个255,就可以让CImage的半透明绘制和GDI+一致了。

假设image是一个CImage的对象,里面包含待透明信息的图片信息,那么对这个对象进行一次下面这个操作就可以了:

if (image.GetBPP() == 32) //确认该图像包含Alpha通道
{
    for (int i=0; i<image.GetWidth(); i++)
    {
        for (int j=0; j<image.GetHeight(); j++)
        {
            byte *pByte = (byte *)image.GetPixelAddress(i, j);
            pByte[0] = pByte[0] * pByte[3] / 255;
            pByte[1] = pByte[1] * pByte[3] / 255;
            pByte[2] = pByte[2] * pByte[3] / 255;
        }
    }
}

事实表明,这样处理一下源图像后,之后的半透明绘制就很正常了。

使用CImage绘制半透明图片相关推荐

  1. MFC 绘制半透明图片

    用MFC绘制半透明图片其实根本没有必要,因为有美工:哈哈,当然了我们自己练手的时候没有美工,自己也不会ps,只能用代码了 void  类名::DrawClearImage(Graphics *pGra ...

  2. java绘制半透明图片_如何使绘制的图像在Java中透明

    正如另一个提到的答案,最简单的方法可能是简单地使用具有透明背景的PNG图像(您可以使用像GIMP这样的图像编辑器创建这些图像).或者,如果您仅限于具有纯色背景的PNG图像,以下是如何将PNG中的给定颜 ...

  3. QT半透明图片叠加显示

    需求描述:两张图片,一张作为背景,另一张半透明,作为前景.透过前景可以看到背景图 1.用QPixmap对象载入背景图片,或者用paint代码在QPixmap自己画图:把QPixmap放入QLabel中 ...

  4. 【PYTHON】 Pilow 将半透明图片绘制到图片中

    python 的pilow在将半透明图片复合到正常图片时,需要用到alpha_composite函数 两张图片都必须保留 alpha 通道,即 mode 为 RGBA,alpha 通道是保存图片透明度 ...

  5. ai 临摹图片换背景_AI临摹绘制插画图片

    AI临摹绘制插画图片 1.打开AI,新建一个文档.开始绘制前,首先确定要画对象的透视参考线.观察原图就会找到基于立体的三维轴线(在这里,我们用X,Y,Z轴来表达). 2.先绘制出外边框,边框线的粗细为 ...

  6. python如何将图片的像素矩阵绘制成图片(python,matplotlib):TypeError: Invalid shape (1, 28, 28) for image data

    矩阵变成图片,这个问题使用(python , matplotlib ) 可以轻松实现. import matplotlib.pyplot as plt #使用格式 plt.imshow(x)#其中x为 ...

  7. java canvas 画图片_[Java教程][HTML5] Canvas绘制简单图片

    [Java教程][HTML5] Canvas绘制简单图片 0 2016-05-13 13:00:04 获取Image对象,new出来 定义Image对象的src属性,参数:图片路径 定义Image对象 ...

  8. 【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )

    文章目录 1. 位图渲染 BitmapShader 简介 ( 1 ) 位图渲染综述 ( ① 三种方式 : Shader.TileMode.CLAMP | Shader.TileMode.REPEAT ...

  9. 解决《Mobile绘制背景图片》中的问题

    与PC平台的开发相比,Mobile的开发麻烦了许多,至少这是我的感觉 . 谢谢--" Fly Pig(^@^)" 的文章<Mobile开发(绘制背景图片) > http ...

最新文章

  1. 在命令行导出MySQL数据到Excel
  2. iOS 之 事件响应者链
  3. Matlab 线性规划问题模型代码
  4. HTML MIME Type
  5. 神经网络 梯度下降_梯度下降优化器对神经网络训练的影响
  6. 前端工程师应该达到什么水平,找工作薪资才比较高?
  7. suitecrm配置(nginx设置)
  8. 手机屏坏了怎么把里面存东西取出来_手机又卡了,到底是运行不够还是存储容量不足?1分钟搞懂...
  9. 如何安装Vscode软件及设置成中文界面?
  10. 更改ubuntu的mysql版本为指定版本
  11. mac安装gnu make_Linux Make的使用以及命令安装详解
  12. js模板引擎template.js的使用
  13. dos批处理脚本自动添加网络共享打印机-简单版且亲测可用
  14. 【预测模型-RF预测】基于随机森林算法实现数据回归预测附matlab代码
  15. 模拟游戏--鸭子的种类
  16. PCB 生产过程中对铜面氧化的防范手段
  17. CentOS上安装 Docker-CE以及Docker 加速器配置
  18. 原光明中医函授大学教材
  19. php下载列表如何实现,phpcms v9 列表页直接下载功能代码实现
  20. Wiradius计费系统功能说明

热门文章

  1. WORD 如何在方框里打勾?
  2. 列表是不是python数据类型的是_在Python中,一个列表中的数据类型是否可以不相同?(回答可以or不可以)...
  3. UnhandledPromiseRejectionWarning报错send()的处理
  4. mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
  5. python函数控制词典_Python 基础之集合相关操作与函数和字典相关函数
  6. html5video标签属性,H5中video标签那些属性和方法
  7. python字典是什么的集合_Python中的字典和集合
  8. python apriori算法 sklearn_R 和 Python (numpy scipy pandas) 用于统计学分析,哪个更好?...
  9. python必须下载到c盘吗_python为什么要安装到c盘
  10. python paramiko exec_command()和invoke_shell()