смешайте два цвета ARGB

Я пытаюсь создать метод, который смешивает два цвета ARGB (второй находится сверху) с цветом с альфа-значением 0xFF, я мог бы просто быть слепым, но после 30 минут поиска в Google я не могу найти способ сделать это. Кроме того, этот метод должен быть достаточно быстрым, потому что все другие методы, которые я пробовал, не работали (для меня?), Замедлили мою программу с 200 до 40 кадров в секунду.

Например, если бы я сделал mix(0xFF0F1F3F, 0x7FFFFFFF), я бы получил светло-голубой цвет, а mix(0x7FFFFFFF, 0xFF0F1F3F) вернул бы 0xFF0F1F3F, потому что он имеет альфа 0xFF.

Мой текущий код:

private int mix(int argbA, int argbB) {
    int argbC = 0;
    // Color mixing code
    return argbC;
}

person DutChen18    schedule 19.05.2015    source источник
comment
не могли бы вы подробнее рассказать о «микшировании»? вы хотите быть посредником для каждого цветового канала (включая альфа-канал)?   -  person Martin Frank    schedule 19.05.2015
comment
@MartinFrank Я хочу смешать значения RGB в зависимости от двух альфа-значений. И новое значение альфа всегда должно быть 0xFF.   -  person DutChen18    schedule 19.05.2015
comment
хорошо, я откорректирую свой ответ - сначала надо кофе ^^   -  person Martin Frank    schedule 19.05.2015
comment
Я думаю, у вас есть два ответа, которые показывают вам, как это работает - но я думаю, что ни один из них не решает вашу проблему - я думаю, вам придется написать свое собственное микширование, но ответы дадут вам некоторые подсказки о том, как вы это сделаете ... .   -  person Martin Frank    schedule 19.05.2015
comment
Возможно, дубликат stackoverflow.com/questions/726549/   -  person Raniz    schedule 19.05.2015


Ответы (2)


хорошо, каналы mediationg argb будут

public int mediateARGB(int c1, int c2){
    int a1 = (c1 & 0xFF000000) >>> 24;
    int r1 = (c1 & 0x00FF0000) >> 16;
    int g1 = (c1 & 0x0000FF00) >> 8;
    int b1 = (c1 & 0x000000FF) ;

    int a2 = (c2 & 0xFF000000) >>> 24;
    int r2 = (c2 & 0x00FF0000) >> 16;
    int g2 = (c2 & 0x0000FF00) >> 8;
    int b2 = (c2 & 0x000000FF) ;

    int am = (a1 + a2) / 2;
    int rm = (r1 + r2) / 2;
    int gm = (g1 + g2) / 2;
    int bm = (b1 + b2) / 2;

    int m = (am << 24) + (rm << 16) + (gm << 8) + bm; 


    return m;
}
person Martin Frank    schedule 19.05.2015

person    schedule
comment
Как я уже сказал, mix(0x7FFFFFFF, 0xFF0F1F3F) вернет 0xFF0F1F3F, потому что у него альфа 0xFF. Второе значение должно быть поверх первого. - person DutChen18; 19.05.2015
comment
@ DutChen18 Хорошо, понятно, без проблем, все, что нам нужно сделать, это настроить коэффициенты alpha1 и alpha2. - person maraca; 19.05.2015
comment
@ DutChen18 не уверен, что это то, что вы хотите, но я думаю, что мы можем оставить alpha2 как есть и взять 256 - alpha2 для alpha1, или вы также хотите принять во внимание альфа-канал 1? - person maraca; 19.05.2015