Смешивание изображений и цветов Android с использованием режимов наложения iOS

В настоящее время я портирую приложение с iOS на Android и столкнулся с некоторыми трудностями при обработке изображений.

У меня есть класс фильтра, состоящий из ImageOverlays и ColorOverlays, которые применяются в определенном порядке к данному базовому растровому изображению. Каждый ColorOverlays имеет значение цвета RGB, BlendModeId и альфа-значение. Каждый ImageOverlay имеет изображение Bitmap, BlendModeId и значение альфа / интенсивности.

Моя основная проблема в том, что мне нужно поддерживать следующие режимы наложения, взятые из iOS:

  1. CGBlendModeNormal
  2. CGBlendModeMultiply
  3. CGBlendModeScreen
  4. CGBlendModeOverlay
  5. CGBlendModeDarken
  6. CGBlendModeLighten
  7. CGBlendModeColorDodge

Некоторые из них имеют соответствующие типы PorterDuff.Mode в Android, а другие нет. Что еще хуже, некоторые из существующих режимов были представлены в последних версиях Android, и мне нужно работать на уровне API 8.

Пытаться создать режимы с нуля крайне неэффективно.

Кроме того, даже с режимами, которые существуют в API8, мне не удалось найти методы, которые смешивают 2 изображения, но позволяют указать интенсивность маски (альфа-значение из ImageOverlay). Аналогично с ColorOverlays.

Функции iOS, которые я пытаюсь воспроизвести в Android, следующие:

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

Я начал искать небольшие сторонние библиотеки, которые поддерживают эти режимы наложения и альфа-операции. Самым многообещающим из них был lib-magick от poelocesar, который предположительно является портом ImageMagick.

Хотя lib-magick действительно предлагал большинство желаемых режимов наложения (называемых CompositeOperator), я не смог найти способ установить значения интенсивности или выполнить цветовую заливку с режимом наложения.

Я уверен, что у кого-то раньше была эта проблема. Любая помощь будет оценена. Кстати, спецификации проекта запрещают мне входить в OpenGLES.


person zienkikk    schedule 28.05.2012    source источник


Ответы (2)


Несмотря на то, что я помог вам по электронной почте, я подумал, что отправлю и ваш вопрос, если кому-то понадобятся дополнительные объяснения :-)

2.2 - это API уровня 8, который поддерживает библиотеку libjnigraphics в NDK, которая дает вам доступ к пиксельному буферу для растровых объектов. Вы можете выполнять эти смешения вручную - это довольно простые математические вычисления, которые можно выполнить очень быстро.

Посетите этот сайт для получения информации о растровых изображениях Android JNI.

Это действительно просто, просто создайте JNI-метод blend () с любыми необходимыми параметрами (либо значениями цвета, либо, возможно, другим растровым объектом для смешивания вместе), заблокируйте пиксельный буфер для этого растрового изображения, выполните необходимые вычисления и разблокируйте растровое изображение. Ссылка

Тем не менее, необходимо проявлять осторожность при выборе формата растрового изображения в памяти, поскольку смещение / вычисление для 565 будет отличаться от 8888. Имейте это в виду, если это выглядит не совсем правильно!

person ZachM    schedule 19.06.2012

Оказалось, что реализация его в jni оказалась не такой болезненной, как предполагалось ранее. По следующей ссылке есть все подробности.

Как Photoshop совмещает два изображения вместе?

person zienkikk    schedule 03.06.2012