Я делаю генератор аватаров, в котором компоненты аватаров взяты из файлов PNG с прозрачностью. Файлы такие вещи, как body_1.png или leg_5.png. Прозрачность вокруг частей, но не внутри них, и все изображения в оттенках серого. Детали хорошо наслоены, и я могу получить аватар в оттенках серого.
Я бы хотел динамически раскрашивать эти части, но пока мне не везет. Я пытался преобразовать данные пикселей из RGB в HSL и использовать значение L исходного пикселя, в то же время предоставляя значение H нового цвета, но результаты невелики.
Я смотрел на Раскрасить изображение в градациях серого , но я не могу заставить его работать в Java. Я получаю изображение с довольно яркими неоновыми цветами повсюду.
Мне бы хотелось, чтобы прозрачность сохранялась при раскрашивании оттенков серого. Черные контуры все еще должны быть черными, а белые области выделения должны быть белыми (я думаю).
У кого-нибудь есть хороший способ сделать это?
EDIT:
Вот изображение, которое я, возможно, пытаюсь раскрасить:
Опять же, я хочу сохранить уровни яркости изображения в градациях серого (чтобы контуры оставались темными, градиенты были видны, а белые пятна были белыми).
Мне удалось заставить работать LookupOp на основе Раскрашивания изображений в Java , но цвета всегда выглядят тусклыми и темными.
Вот пример моего вывода:
Используется следующий цвет (обратите внимание на разницу яркости): http://www.color -hex.com / color / b124e7
Это мой поискОп
protected LookupOp createColorizeOp(short R1, short G1, short B1) {
short[] alpha = new short[256];
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
//int Y = 0.3*R + 0.59*G + 0.11*B
for (short i = 0; i < 30; i++) {
alpha[i] = i;
red[i] = i;
green[i] = i;
blue[i] = i;
}
for (short i = 30; i < 256; i++) {
alpha[i] = i;
red[i] = (short)Math.round((R1 + i*.3)/2);
green[i] = (short)Math.round((G1 + i*.59)/2);
blue[i] = (short)Math.round((B1 + i*.11)/2);
}
short[][] data = new short[][] {
red, green, blue, alpha
};
LookupTable lookupTable = new ShortLookupTable(0, data);
return new LookupOp(lookupTable, null);
}
РЕДАКТИРОВАТЬ 2: я изменил свой LookupOp, чтобы использовать следующие и получил гораздо более приятные цвета:
red[i] = (short)((R1)*(float)i/255.0);
green[i] = (short)((G1)*(float)i/255.0);
blue[i] = (short)((B1)*(float)i/255.0);