我目前正在将一个应用程序从 iOS 移植到 Android,但在图像处理方面遇到了一些困难。
我有一个由 ImageOverlays 和 ColorOverlays 组成的滤镜类,它们以特定顺序应用于给定的基本位图。每个 ColorOverlays 都有一个 RGB 颜色值、一个 BlendModeId 和一个 alpha 值。每个 ImageOverlay 都有一个图像位图、一个 BlendModeId 和一个 alpha/强度值。
我的主要问题是我需要支持以下取自 iOS 的混合模式:
- CGBlendModeNormal
- CGBlendModeMultiply
- CGBlendModeScreen
- CGBlendModeOverlay
- CGBlendModeDarken
- CGBlendModeLighten
- CGBlendModeColorDodge
其中一些在 Android 中具有相应的 PorterDuff.Mode 类型,而另一些则没有。更糟糕的是,一些确实存在的模式是在最新版本的 Android 中引入的,我需要在 API 级别 8 上运行。
尝试从头开始构建模式效率极低。
此外,即使使用 API8 中确实存在的模式,我也无法找到混合 2 个图像但允许您指定 mask 强度(来自 ImageOverlay 的 alpha 值)的方法。与 ColorOverlays 类似。
我试图在 Android 中复制的 iOS 功能是
CGContextSetBlendMode(...)
CGContextSetFillColorWithColor(...)
CGContextFillRect(...) - This one is easy
CGContextSetAlpha(...)
我已经开始寻找支持这些混合模式和 alpha 操作的小型第三方库。最有希望的是 poelocesar's lib-magick这应该是 ImageMagick 的一个端口.
虽然 lib-magick 确实提供了大部分所需的混合模式(称为 CompositeOperator
),但我无法找到一种方法来设置强度值或使用混合模式进行颜色填充。
我敢肯定有人以前遇到过这个问题。任何帮助,将不胜感激。顺便说一句,项目规范禁止我进入 OpenGLES。
最佳答案
尽管我通过电子邮件帮助了您,但我想我也会发布您的问题,以防有人需要更多解释:-)
2.2是API level 8,支持“libjnigraphics”库 NDK,它使您可以访问位图对象的像素缓冲区。 您可以手动进行这些混合——它们是非常简单的数学运算 计算并且可以非常快速地完成。
查看 this site用于 Android JNI 位图信息。
这真的很简单,只需创建一个 JNI 方法 blend() 与任何 您需要的参数(颜色值或可能混合在一起的另一个位图对象),锁定该位图的像素缓冲区,执行 需要计算,并解锁位图。 Link
不过,需要注意内存中位图的格式, 因为 565 的移位/计算将不同于 8888。如果它看起来不完全正确,请记住这一点!
关于使用 iOS 混合模式的 Android 图像和颜色混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778159/