2012-02-19 4 views
1

Это приложение для Android. Скажем, у меня есть два цвета с альфаВычисление комбинированного цвета двух цветов (над оператором)

int color1 = 0x12345678 // aarrggbb 
int color2 = 0x87654321 

Как вычислить комбинированный цвет слоя с цвет2 над слоем с цвет1?

Я нашел здесь обсуждение и формулу, но сначала проверяю, если он уже доступен на Android и/или Java, прежде чем писать собственный код.

http://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator

Edit: Обратите внимание, что цель этого вопроса не до конца с растровым изображением, но цвет (например, aarrggbb INT).

ответ

1

Я думаю, что вы хотите, может быть PorterDuff.Mode.Multiply

... используется с PorterDuffColorFilter.

РЕДАКТИРОВАТЬ: На самом деле, возможно, вам нужен режим DST_OVER для цвета цвета «поверх» источника.

+0

Thanks nmr. Как использовать его для вычисления составного цвета? Вам нужно нарисовать одноразрядное растровое изображение, а затем прочитать этот пиксель? – user1139880

+0

О, да, хм. Я не знаю лучшего способа, чем это. – nmr

0
+0

Доступна ли версия javax.media с платформы Android? – nmr

+0

Как получить составное значение цвета? Нужно ли рисовать на одном пиксельном растровом изображении и считывать этот пиксель – user1139880

4

я в конечном итоге его реализации. Прямая переработка формулы Википедии. Любая проблема с этой реализацией ?

// a2 over a1 
private static int compositeAlpha(int a1, int a2) { 
    return 255 - ((255 - a2) * (255 - a1))/255; 
} 


// For a single R/G/B component. a = precomputed compositeAlpha(a1, a2) 
private static int compositeColorComponent(int c1, int a1, int c2, int a2, int a) { 
    // Handle the singular case of both layers fully transparent. 
    if (a == 0) { 
     return 0x00; 
    } 
    return (((255 * c2 * a2) + (c1 * a1 * (255 - a2)))/a)/255; 
} 

// argb2 over argb1. No range checking. 
public static int compositeColor(int argb1, int argb2) { 
    final int a1 = Color.alpha(argb1); 
    final int a2 = Color.alpha(argb2); 

    final int a = compositeAlpha(a1, a2); 

    final int r = compositeColorComponent(Color.red(argb1), a1, 
      Color.red(argb2), a2, a); 
    final int g = compositeColorComponent(Color.green(argb1), a1, 
      Color.green(argb2), a2, a); 
    final int b = compositeColorComponent(Color.blue(argb1), a1, 
     Color.blue(argb2), a2, a); 

    return Color.argb(a, r, g, b); 
} 
Смежные вопросы