Быстрое умножение эффекта смешивания на пиксель в C# (для Android)

Я искал более быстрый способ использования эффекта смешивания «умножить» на моих растровых изображениях. Я пытался использовать PorterDuff.Multiply, но это не дает желаемого результата на растровых изображениях, содержащих альфа-каналы, все, что имеет значение альфа-канала 0, становится черным.

Я читал вокруг, и кажется, что единственный способ добиться эффекта, который мне нужен (смешивание слоев «умножение» в photoshop / gimp), - это применить эффект на пиксель.

OpenGL не подходит для приложения.

Я не уверен, правильно ли я понимаю алгоритм для режима наложения, предложенного Википедией.

TopColour * BottomColour / 255

Было бы:

ColorC.R = ColorA.R * ColorB.R / 255;
ColorC.G = ColorA.G * ColorB.G / 255;
ColorC.B = ColorA.B * ColorB.B / 255;
// Alpha = Alpha?

// This example is suggesting Android.Graphics.Color.A/R/G/B is writeable, 
// it's not - this is just for readability.
// ColorA = Top, ColorB = Bottom, ColorC = Result

Было бы быстрее преобразовать Color.ToArgb и работать с целым числом? И, наконец, правильно ли я рассчитываю эффект умножения - он не отображается должным образом :(

Я застрял, любая помощь будет большой признательна.

Спасибо.


person Ecnelis    schedule 28.09.2012    source источник
comment
Эта статья может пролить свет на kevindion.com/2011/01/android. -bitmap-blending-color-channels   -  person auselen    schedule 28.09.2012
comment
Я думаю, намек на это в том, чтобы использовать режим ARGB_8888, таким образом вы также сможете смешивать альфа-значения.   -  person Cheesebaron    schedule 28.09.2012
comment
@auselen спасибо! Чтение этого пролило свет на мой затуманенный разум. Благодаря этой небольшой статье я понял намного больше о процессе смешивания. Хорошая находка!.   -  person Ecnelis    schedule 29.09.2012
comment
@Cheesebaron В режиме наложения умножения Альфа тоже будет умножаться? ColorC.A = ColorA.A * ColorB.A / 255; Попробую! :) Спасибо. (или мне нужно будет сначала умножить альфу на каждый другой цветовой канал? ‹ Вот где я запутался, лол).   -  person Ecnelis    schedule 29.09.2012


Ответы (1)


Если вы хотите быстро, вам нужно заглянуть в Renderscript, http://developer.android.com/guide/topics/renderscript/index.html .

Это видео от Google также показывает вам более или менее все, что вам нужно, http://www.youtube.com/watch?v=gbQb1PVjfqM (Google IO 2012 – Делаем больше с меньшими затратами: быть хорошим гражданином Android).

person Marius Kjeldahl    schedule 28.09.2012
comment
Про рендерскрипт не знал, это точно пригодится. И мне нужно посмотреть это видео, добавленное в закладки в начале моей панели инструментов. Спасибо. - person Ecnelis; 29.09.2012