В настоящее время я портирую приложение с iOS на Android и столкнулся с некоторыми трудностями при обработке изображений.
У меня есть класс фильтра, состоящий из ImageOverlays и ColorOverlays, которые применяются в определенном порядке к данному базовому растровому изображению. Каждый ColorOverlays имеет значение цвета RGB, BlendModeId и альфа-значение. Каждый ImageOverlay имеет изображение Bitmap, BlendModeId и значение альфа / интенсивности.
Моя основная проблема в том, что мне нужно поддерживать следующие режимы наложения, взятые из iOS:
- CGBlendModeNormal
- CGBlendModeMultiply
- CGBlendModeScreen
- CGBlendModeOverlay
- CGBlendModeDarken
- CGBlendModeLighten
- 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.