2015-12-30 7 views
0

У меня есть следующий образ:фильтр растрового изображения в разные цвета с помощью PorterDuffColorFilter

enter image description here

Теперь я хотел бы, чтобы фильтровать изображения на различные цвета во время выполнения. Например. Я хочу, чтобы иметь возможность генерировать зеленый вариант, где нижняя часть имеет более темный зеленый цвет, а верхняя левая часть светлее зеленая.

Как это сделать? Возможно ли это?

Я попытался фильтрации растрового изображения, как выглядит следующим образом:

private static Bitmap applyColorFilter(Bitmap source, int color) { 

    Bitmap empty = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight()); 
    Canvas c = new Canvas(empty); 
    Paint p = new Paint(); 

    PorterDuffColorFilter pdcf = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); 
    p.setColorFilter(pcdf); 
    c.drawBitmap(empty, 0, 0, p); 
    source.recycle(); 
    return empty; 
} 

Я попытался все из PorterDuff.Mode с, но ни один из них на самом деле не работает. Иногда (например, SRC_IN) я вижу круг, полностью заполненный новым цветом, без затенения. В других случаях я вижу квадрат.

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

ответ

0

Я нашел решение, используя ColorMatrixColorFilter.

// Take values from the destination color 
int destA = (color >> 24); 
int destR = (color >> 16) & 0xff; 
int destG = (color >> 8) & 0xff; 
int destB = color & 0xff; 

// Give the same weight to source R,G,B, thus grasping the intensity 
// -> the shading overlay 
float mean = 0.33f; 
ColorMatrixColorFilter cm = new ColorMatrixColorFilter(
     new float[]{ 
       mean,mean,mean,0,destR, 
       mean,mean,mean,0,destG, 
       mean,mean,mean,0,destB, 
       0,0,0,1,destA } 
); 

Paint p = new Paint(); 
p.setColorFilter(cm); 
... 

Неизбежно это немного изменяет (выделяет) цвет назначения, поэтому я подожду несколько дней для лучшего решения. Для моего входного изображения я получаю лучшие результаты, уменьшая значение mean до ок. 0.2.

Тот же результат можно было бы получить с помощью LightningColorFilter.