2015-10-04 3 views
1

Я изо всех сил старался объединить два значения ARGB - несмотря на много чтения, например. здесь ... How to mix two ARGB pixels?Комбинация/смешивание двух значений ARGB (альфа - красный, зеленый синий)

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

Я хочу объединить:

  1. Colora (красный = 255, зеленый = 255, синий = 0, альфа = 100)

  2. ColorB (красный = 0, зеленый = 0, синий = 100, alpha = 200)

И вывести значение в красный, зеленый, синий, альфа-формат.

Я ожидаю выход следующим образом (зеленоватый центральный цвет):

enter image description here

спасибо за помощь этот дурацкий кодировщик!

+0

Проблема здесь состоит в том, что вы не указали, что вы ожидаете, чтобы это произошло. Существуют различные способы «комбинировать» два цвета. – BoltClock

+0

Существует множество способов сочетания двух цветов; например. может принимать оттенок от одного и значение, насыщенность и альфа от другого; В равной степени вы можете усреднить каждый атрибут. Вам нужно определить, как вы хотите, чтобы они были объединены. – Richard

+0

@ Richard: lol, great minds;) – BoltClock

ответ

0

Как и большинство вопросов, один заканчивает отвечать ему один себя:

public static int MergeColors(int backgroundColor, int foregroundColor) { 
    final byte ALPHA_CHANNEL = 24; 
    final byte RED_CHANNEL = 16; 
    final byte GREEN_CHANNEL = 8; 
    final byte BLUE_CHANNEL = 0; 

    final double ap1 = (double)(backgroundColor >> ALPHA_CHANNEL & 0xff)/255d; 
    final double ap2 = (double)(foregroundColor >> ALPHA_CHANNEL & 0xff)/255d; 
    final double ap = ap2 + (ap1 * (1 - ap2)); 

    final double amount1 = (ap1 * (1 - ap2))/ap; 
    final double amount2 = amount1/ap; 

    int a = ((int)(ap * 255d)) & 0xff; 

    int r = ((int)(((float)(backgroundColor >> RED_CHANNEL & 0xff)*amount1) + 
      ((float)(foregroundColor >> RED_CHANNEL & 0xff)*amount2))) & 0xff; 
    int g = ((int)(((float)(backgroundColor >> GREEN_CHANNEL & 0xff)*amount1) + 
      ((float)(foregroundColor >> GREEN_CHANNEL & 0xff)*amount2))) & 0xff; 
    int b = ((int)(((float)(backgroundColor & 0xff)*amount1) + 
      ((float)(foregroundColor & 0xff)*amount2))) & 0xff; 

    return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL; 
} 

Источник: Color mixing in android

Смежные вопросы