本文介绍透明度叠加算法(Alpha Blending Algorithm),并用 C#/WPF 的代码,以及像素着色器的代码 HLSL 来实现它。


本文内容

  • 算法
  • 在 C# 代码中实现
  • 在像素着色器中实现

算法

对于算法,我只是搬运工,可以随意搜索到。算法详情请查看:Alpha compositing - Wikipedia。

对于完全不透明的背景和带有透明度的前景,合并算法为:

float r = (foreground.r * alpha) + (background.r * (1.0 - alpha));

这是红色。然后绿色 g 和蓝色 b 通道进行一样的计算。最终合成图像的透明通道始终设置为 1。

在 C# 代码中实现

多数 UI 框架对于颜色值的处理都是用一个 byte 赛表单个通道的一个像素。于是计算会采用 0xff 即 255。

for (int i = 0; i + 4 < length; i = i + 4)
{var backB = background[i];var backG = background[i + 1];var backR = background[i + 2];var foreB = foreground[i];var foreG = foreground[i + 1];var foreR = foreground[i + 2];double alpha = foreground[i + 3];blue = 0;output[i] = (foreB * alpha) + (backB * (1.0 - alpha));output[i + 1] = (foreG * alpha) + (backG * (1.0 - alpha));output[i + 2] = (foreR * alpha) + (backR * (1.0 - alpha));output[i + 3] = 1.0;
}

这段代码当然是跑不起来的,因为是下面两篇博客的魔改代码。你需要阅读以下两篇博客了解如何在 WPF 中按像素修改图像,然后应用上面的透明度叠加代码。

  • WPF 修改图片颜色
  • WPF 通过位处理合并图片

话说,一般 UI 框架都自带有透明度叠加,为什么还要自己写一份呢?

当然是因为某些场景下我们无法使用到 UI 框架的透明度叠加特性的时候。例如使用 HLSL 编写像素着色器的一个实现。

下面使用像素着色器的实现是我曾经写过的一个特效的一个小部分,我把透明度叠加的部分单独摘取出来。

在像素着色器中实现

以下是 HLSL 代码的实现。Background 是从采样寄存器 0 取到的颜色采样,Foreground 是从采样寄存器 1 取到的颜色采样。

这里的计算中,背景是不带透明度的,而前景是带有透明度的。

/// <description>透明度叠加效果。</description>sampler2D Background : register(s0);
sampler2D Foreground : register(s1);float4 main(float2 uv : TEXCOORD) : COlOR
{float4 background = tex2D(Background, uv);float4 foreground = tex2D(Foreground, uv);float alpha = foreground.a;float r = (foreground.r * alpha) + (background.r * (1.0 - alpha));float g = (foreground.g * alpha) + (background.g * (1.0 - alpha));float b = (foreground.b * alpha) + (background.b * (1.0 - alpha));float a = 1.0;return float4(r, g, b, a);
}

如果要测试的图片都是不带透明度的,那么可以通过自己设一个透明度来模拟,传入透明度值 Alpha。

/// <description>透明度叠加效果。</description>/// <type>Double</type>
/// <summary>采样 2 的叠加透明度。</summary>
/// <minValue>0.0</minValue>
/// <maxValue>1.0</maxValue>
/// <defaultValue>0.75</defaultValue>
float Alpha : register(C0);sampler2D Background : register(s0);
sampler2D Foreground : register(s1);float4 main(float2 uv : TEXCOORD) : COlOR
{float4 background = tex2D(Background, uv);float4 foreground = tex2D(Foreground, uv);float alpha = Alpha;float r = (foreground.r * alpha) + (background.r * (1.0 - alpha));float g = (foreground.g * alpha) + (background.g * (1.0 - alpha));float b = (foreground.b * alpha) + (background.b * (1.0 - alpha));float a = 1.0;return float4(r, g, b, a);
}


参考资料

  • Alpha compositing - Wikipedia
  • algorithm - Manually alpha blending an RGBA pixel with an RGB pixel - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

透明度叠加算法:如何计算半透明像素叠加到另一个像素上的实际可见像素值(附 WPF 和 HLSL 的实现)相关推荐

  1. c语言图像透明度混合,用像素叠加轻松实现图片的半透明混合

    用像素叠加轻松实现图片的半透明混合 分类:计算机等级 | 更新时间:2016-07-07| 来源:转载 半透明的混合效果经常在游戏里看到,效果那叫一个好.有天好奇心起,想琢磨一下这种效果是怎么实现的. ...

  2. 深圳创凯电子公司多视频底图像素叠加

    转帖网站:http://www.ty360.com/2009/2009_8_25491.htm 如果本文侵犯了您的权利,请及时留言.本人道歉并及时删除! 功能概述 CK4PV4系列大屏拼接器是深圳创凯 ...

  3. 【Unity3d Shader】颜色叠加算法

    把图片B(半透明)压在图片A(半透明)上面的颜色叠加算法 half4 blend_color(half4 c1, half4 c2){half4 result = half4(0, 0, 0, max ...

  4. [html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起,透明度是多少

    [html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起,透明度是多少 首先是透明度值的计算.颜色在本质上是光的产物,假设把透明度理解为玻璃的透光性,则一切就变得很easy.比如 ...

  5. PSOLA基音同步叠加算法

    PSOLA(Pitch Synchronous Overlap Add)算法 语音合成:基于波形合成(波形编码合成.波形编辑合成),基于参数合成,基于规则合成 PSOLA算法在规则指导下,对波形进行编 ...

  6. RGBA alpha 透明度混合算法实现和测试

    目录 1.算法叙述 1.1.透明度混合算法1 1.2.AlphaBlend算法介绍 1.3.简易Alpha混合算法 2.算法实现代码和测试 2.1.透明度混合算法1实现代码 2.1.AlphaBlen ...

  7. pr视频叠加,即原视频右上角添加另外一个视频方法,以及pr导出视频步骤

    一.pr视频叠加,即原视频右上角添加另外一个视频方法 在使用pr制作视频时,我们希望在原视频的左上角或右上角同步播放另外一个视频,如下图所示: 具体方法为: 1.导入原视频,第一个放在v1位置,第二个 ...

  8. 算法 —— 如何计算时间复杂度

    Big O notation O(1): Constant Complexity: Constant 常数复杂度 O(log n): Logarithmic Complexity: 对数复杂度 O(n ...

  9. 从像素之间谈起:像素游戏的画面增强(上)

    分类 随着分辨率的普遍提高,我们已经告别了依赖于简陋像素来表现游戏画面的年代.但还是有不少人像我一样沉迷于像素美术和游戏.如今到处可以都可以看到的各式像素作品,虽然大多被直接称呼为像素画,但实际上已经 ...

最新文章

  1. 腾讯开源首个医疗AI项目,业内首个3D医疗影像大数据预训练模型
  2. 全球与中国植物基液压油市场供需预测及未来发展展望报告2022-2028年版
  3. Windows10 编译 Open3D 时出现 error C2220: 以下警告被视为错误 (编译源文件
  4. 运放搭建主动滤波电路
  5. 玩转SpringSession,重要知识点全面剖析(续篇)
  6. 逐步创建ASP.NET Core 2.2应用程序
  7. 指定module_详解流量复制解决方案--NGINX的ngx_http_mirror_module模块实现
  8. 学历影响程序员的工资吗?
  9. HCIE Security 防火墙多出口选路 备考笔记(幕布)
  10. java破坏双亲委派_java的类加载机制-双亲委派,破坏双亲委派
  11. 元气骑士没有手柄怎么解锁机器人_元气骑士机器人怎么解锁?机器人获取方式和技能介绍...
  12. latex_列表和表格环境_给tabular加lable标签问题
  13. FPGA学习笔记_图像处理3_FPGA实现中值滤波算法
  14. 《定时执行专家》V5.4软件使用手册
  15. speechSynthesis没有声音
  16. 最新苹果同步器技术-手机群控操作-脚本录制分屏控制-实时同步操作一系列APP功能解析分享
  17. 【task09】集合运算---内连结
  18. 购买阿里云域名绑定ip教程
  19. 牛客网编程题之多行输入思路
  20. 艾永亮:超级产品战略助戴森品牌C位出道,它却在汽车行业栽跟头

热门文章

  1. 编写程序,创建类MyMath,计算圆的周长和面积以及球的表面积和体积,并编写测试代码,结果保留两位小数。
  2. Kafka-Confluent平台
  3. 企业邮箱如何绑定微信?微信怎么添加邮箱?
  4. 【老九学堂】【初识C语言】二维数组
  5. 易地推拓客分享客户ABCD分层认知对引流拓客和留客转化的影响
  6. 点云学习笔记7——python pcl将点云数据转换成俯视图(鸟瞰图)
  7. 可视化神器Plotly玩转柱状图
  8. SpringBoot使用Pageable实现分页
  9. JTextPanel对word复制粘贴
  10. 新闻人工智能真的能让内容产业迎来第二春?