3

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

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

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

  1. CGBlendModeNormal
  2. CGBlendMode乘法
  3. CGBlendModeScreen
  4. CGBlendModeOverlay
  5. CGBlendModeDarken
  6. CGBlendModeLighten
  7. CGBlendModeColorDodge

其中一些在 Android 中有相应的 PorterDuff.Mode 类型,而另一些则没有。更糟糕的是,一些确实存在的模式是在最新版本的 Android 中引入的,我需要在 API 级别 8 上运行。

尝试从头开始构建模式效率极低。

此外,即使使用 API8 中确实存在的模式,我也无法找到混合 2 个图像但允许您指定蒙版强度(来自 ImageOverlay 的 alpha 值)的方法。与 ColorOverlays 类似。

我试图在 Android 中复制的 iOS 功能是

CGContextSetBlendMode(...)
CGContextSetFillColorWithColor(...)
CGContextFillRect(...) - This one is easy
CGContextSetAlpha(...)

我已经开始研究支持这些混合模式和 alpha 操作的小型第三方库。最有希望的是poelocesar 的 lib-magick,据说它是ImageMagick的一个端口。

虽然 lib-magick 确实提供了大多数所需的混合模式(称为CompositeOperator),但我无法找到设置强度值或使用混合模式进行颜色填充的方法。

我敢肯定以前有人遇到过这个问题。任何帮助,将不胜感激。顺便说一句,项目规范禁止我进入 OpenGLES。

4

2 回答 2

2

即使我通过电子邮件帮助了你,我想我也会发布你的问题,以防有人需要更多解释:-)

2.2 是 API 级别 8,它支持 NDK 中的“libjnigraphics”库,它使您可以访问位图对象的像素缓冲区。您可以手动进行这些混合 - 它们是非常简单的数学计算,并且可以非常快速地完成。

查看此站点以获取 Android JNI 位图信息。

这真的很简单,只需使用您需要的任何参数(颜色值或可能要混合在一起的另一个位图对象)创建一个 JNI 方法 blend(),锁定该位图的像素缓冲区,进行所需的计算,然后解锁位图。 关联

但是,需要注意内存中位图的格式,因为 565 的移位/计算将不同于 8888。如果它看起来不完全正确,请记住这一点!

于 2012-06-19T14:51:50.200 回答
2

事实证明,在 jni 中实现它并没有之前预期的那么痛苦。以下链接包含所有详细信息。

Photoshop如何将两张图片融合在一起?

于 2012-06-03T17:34:45.293 回答