Удалить альфу из цвета, но сохранить его текстуру - PullRequest
6 голосов
/ 12 октября 2011

У меня есть цвет #6A8F6509

Я хочу удалить альфа-часть этого цвета и оставить только компоненты RGB (т. Е. #RRGGBB).

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

Как мне это сделать на Android Java?

Обновление: Исходный фон всегда белый (#FFF)

Ответы [ 5 ]

24 голосов
/ 12 октября 2011
int newColor = oldColor | 0xFF000000;
12 голосов
/ 12 октября 2011

Если вы хотите сделать это с кодом, вы можете попробовать следующий код:

    static int stripAlpha(int color){
    return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
}
5 голосов
/ 12 октября 2011

Для каждого цвета: C '= C (a / 255) + 255 (1- (a / 255))

Так для # 6A8F6509:

R '= 143 (106/255) + 255 (1- (106/255) = (приблизительно) 208

G '= 101 (106/255) + 255 (1- (106/255) = (приблизительно) 191

B '= 9 (106/255) + 255 (1- (106/255) = (приблизительно) 153

Итак, ваш ответ должен быть: # D0BF99, если моя математика верна. Это относится только ко всему белому фону - для небелого фона второе дополнение должно иметь соответствующее соответствующее значение цвета фона вместо 255.

- РЕДАКТИРОВАТЬ -

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

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

1 голос
/ 12 октября 2011

try

#FF8F6509

первые две цифры обозначают альфа-значение любого цвета.

0 голосов
/ 12 октября 2011

Я признаю, что не знал Java для Android, но разве нельзя просто изменить цвет с # 6A8F6509 на # FF8F6509? В большинстве современных языков программирования цвет обычно кодируется как ## AARRGGBB.

AA = Hex of Alpha, от 0 (hex 00), полностью прозрачный, до 255 (hex FF), без прозрачности.

RR = Hex красной части цвета. Как и выше, 0 не красный, 255 полный красный.

GG = Гекс зеленого цвета.

BB = шестнадцатеричный синий.

-Edit-

На основе вашего обновления вы можете сделать это, чтобы получить цвет:

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

В вашем случае:

int transparentR = 0x8F;
int transparentG = 0x65;
int transparentB = 0x09;
int backgroundR = 0xFF;
int backgroundG = 0xFF;
int backgroundB = 0xFF;
int alpha = 0x6A;

int newR = transparentR + ( ( (backgroundR - transparentR) * alpha ) / 255 );
int newG = transparentR + ( ( (backgroundG - transparentG) * alpha ) / 255 );
int newB = transparentR + ( ( (backgroundB - transparentB) * alpha ) / 255 );

-Редакт, снова-

Хорошо, я переделал формулу на основе ответа LJ2, используя функцию альфа-смешивания Википедии. и коллега подтвердил это с помощью Paint.Net. Это версия, где цвет фона полностью непрозрачен, и это в C #, извините:

 int transparentColor2(int intFgColor, int intBgColor, int intAlpha)
 {
double dAlpha = (Convert.ToDouble(intAlpha)/255.0);
double dFirst = Convert.ToDouble(intFgColor) * dAlpha;
double dSecond = Convert.ToDouble(intBgColor) * (1 - dAlpha);
return Convert.ToInt32(dFirst + dSecond);
 }

сделайте это для каждого значения R, G и B, и вы должны получить правильный ответ. Incase для Java в Java отличается, double может быть Double / Single / Float, а int может быть Int32 / Int16 / Int64 / Byte. Я не помню, как конвертировать между двумя в Java, к сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...