C# 中的快速逐像素混合效果“相乘”(适用于 android)

Posted

技术标签:

【中文标题】C# 中的快速逐像素混合效果“相乘”(适用于 android)【英文标题】:Fast per-pixel blend effect "multiply" in C# (for android) 【发布时间】:2012-09-20 03:07:56 【问题描述】:

我一直在寻找一种更快的方法来在我的位图上使用“相乘”混合效果。我尝试过使用PorterDuff.Multiply,但它在包含 Alpha 通道的位图上没有达到预期的效果,任何 0 alpha 的东西都会变成黑色。

我已经阅读过,似乎我可以达到我所追求的效果(photoshop/gimp 的“乘法”图层混合)的唯一方法是应用每个像素的效果。

OpenGL 不是该应用程序的选项。

我不确定我是否正确理解 Wikipedia 建议的混合模式的算法。

TopColour * BottomColour / 255

应该是:

ColorC.R = ColorA.R * ColorB.R / 255;
ColorC.G = ColorA.G * ColorB.G / 255;
ColorC.B = ColorA.B * ColorB.B / 255;
// Alpha = Alpha?

// This example is suggesting android.Graphics.Color.A/R/G/B is writeable, 
// it's not - this is just for readability.
// ColorA = Top, ColorB = Bottom, ColorC = Result

转换Color.ToArgb 并使用整数会更快吗? 最后,我是否正确计算了乘法效果 - 它没有正确显示:(

我被困住了,任何帮助将非常感激。

谢谢。

【问题讨论】:

这篇文章可能会有所启发kevindion.com/2011/01/android-bitmap-blending-color-channels 我认为提示是使用 ARGB_8888 模式,这样您也可以混合 Alpha 值。 @auselen 谢谢!读到这本书,让我阴云密布的头脑有些清醒。因为那篇小文章,我对混合过程有了更多的了解。很好的发现!。 @Cheesebaron 使用乘法混合模式,Alpha 是否也会乘法? ColorC.A = ColorA.A * ColorB.A / 255;我试试看! :) 谢谢。 (或者我需要先将 Alpha 乘以其他颜色通道吗?> 【参考方案1】:

如果你想要快速,你需要查看 Renderscript,http://developer.android.com/guide/topics/renderscript/index.html

这段来自 Google 的视频也或多或少地向您展示了您需要的一切,http://www.youtube.com/watch?v=gbQb1PVjfqM(Google IO 2012 - 事半功倍:成为一名优秀的 Android 公民)。

【讨论】:

我不知道renderscript,这个肯定会派上用场的。我需要观看该视频 - 在我的工具栏开头添加了书签。谢谢。

以上是关于C# 中的快速逐像素混合效果“相乘”(适用于 android)的主要内容,如果未能解决你的问题,请参考以下文章

PS中图层混合模式的计算方法

为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?

快速幂取模(当数很大时,相乘long long也会超出的解决办法)

适用于 iOS/Android/Windows 8 的混合应用程序

PS图层混合算法之三(滤色, 叠加, 柔光, 强光)

GDI+下Bitmap逐像素快速读写性能测试