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)的主要内容,如果未能解决你的问题,请参考以下文章
快速幂取模(当数很大时,相乘long long也会超出的解决办法)