Я пытаюсь написать графический эффект, в котором кружок движется вокруг изображения, смазывая изображение, как оно есть (например, как бы работал инструмент smudge в Gimp или Photoshop).Основной алгоритм, который я использую:
- круг перемещается из положения A в положение B на растровом изображении
- копирует круг пикселей из положения A во временное растровое изображение
- нарисуйте этот круг пикселей из временного растрового изображения в положение B, используя альфа около 50%.
Это работает нормально и выглядит так, как я ожидал, где изображение будет выглядеть так, как будто оносмазывание, если круг перемещается на 1 пиксель за раз по изображению.
Теперь я хочу добавить текстуру к эффекту пятна.У меня есть растровое изображение, которое содержит картинку с краской.Алгоритм, описанный выше, изменен на следующий, поэтому пятно принимает форму этого объекта рисования:
- , как и раньше
- , замените временные растровые пиксели текстурой объекта рисования, затем скопируйтекруг пикселей из положения A во временное растровое изображение, но сохраняйте только те пиксели, которые совпадают с пикселями пятна краски (т. е. используйте режим «источник в месте назначения» Porter-Duff при рисовании круга во временное растровое изображение).
- как и раньше
Это почти работает, и выглядит поначалу нормально, но постепенно пятно делает цвета в моем изображении темнее!Если круг проходит над одной и той же областью несколько раз, цвета в конечном итоге изменятся на черный.Есть идеи, что я могу делать не так?
Я реализовал вышеупомянутое в Android.Я случайно натолкнулся на этот пост о том, что растровые изображения в Android (например, моя текстура с краской) загружаются с «предварительно умноженной альфа», где автор говорит, что из-за этого его изображения становятся темнее: http://www.kittehface.com/2010/06/androidbitmap-and-premultiplied-alpha.html
Я подозреваю,У меня похожая проблема, но я не понимаю, что происходит достаточно хорошо, и не знаю, как ее исправить.У кого-нибудь есть намеки на то, что может происходить?