使用 iOS 混合模式的 Android 图像和颜色混合

标签 android ios image image-processing alphablending

我目前正在将一个应用程序从 iOS 移植到 Android,但在图像处理方面遇到了一些困难。

我有一个由 ImageOverlays 和 ColorOverlays 组成的滤镜类,它们以特定顺序应用于给定的基本位图。每个 ColorOverlays 都有一个 RGB 颜色值、一个 BlendModeId 和一个 alpha 值。每个 ImageOverlay 都有一个图像位图、一个 BlendModeId 和一个 alpha/强度值。

我的主要问题是我需要支持以下取自 iOS 的混合模式:

  1. CGBlendModeNormal
  2. CGBlendModeMultiply
  3. CGBlendModeScreen
  4. CGBlendModeOverlay
  5. CGBlendModeDarken
  6. CGBlendModeLighten
  7. 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/

相关文章:

java - 如何在我的 list 中正确设置多个 applicationIds 或包名称

Android Time Picker 纵向显示,横向截断

ios - 在哪里初始化 subview ?

iOS gestureRecognizer 未处理 subview

java - ImageIcon 方法不适用于所有图像

css - Bootstrap 模态框不适合浏览器大小

安卓 : How get the current Application Context in AsyncTask?

ios - Xcode 7 上的 Swift 发生 fatal error

jQuery:添加和删除图像

android - 如何从 Firebase 数据库中获取随机对象?