Как правильно раскрасить изображение в градациях серого с помощью прозрачности в Java? - PullRequest
6 голосов
/ 01 октября 2011

Я делаю генератор аватаров, в котором компоненты аватаров взяты из файлов PNG с прозрачностью. Файлы такие вещи, как body_1.png или leg_5.png. Прозрачность вокруг частей, но не внутри них, и все изображения в оттенках серого. Детали хорошо наслоены, и я могу получить аватар в оттенках серого.

Я бы хотел динамически раскрашивать эти части, но пока мне не везет. Я пытался преобразовать данные пикселей из RGB в HSL и использовать значение L исходного пикселя, в то же время предоставляя значение H нового цвета, но результаты невелики.

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

Мне бы хотелось, чтобы прозрачность сохранялась при раскрашивании оттенков серого. Черные контуры все еще должны быть черными, а белые области выделения должны быть белыми (я думаю).

У кого-нибудь есть хороший способ сделать это?

EDIT:

Вот изображение, которое я, возможно, пытаюсь раскрасить: Sample Body

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

Мне удалось заставить работать LookupOp на основе Раскрашивания изображений в Java , но цвета всегда выглядят тусклыми и темными.

Вот пример моего вывода: Sample Output

Используется следующий цвет (обратите внимание на разницу яркости): 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);

1 Ответ

2 голосов
/ 01 октября 2011

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

for each pixel
    if pixel is white, black or transparent then leave it alone
    else
        apply desired H and S and make grayscale value the L
        convert new HSL back to RGB

Редактировать : после просмотра ваших изображений у меня есть пара комментариев:

Этокажется, вы хотите специально обработать более темные тона, поскольку вы не окрашиваете ничего ниже 30. Следуя той же логике, не должны ли вы также освободиться от окрашивания более высоких значений?Это предотвратит окрашивание белого и почти белого цветов.

Не следует устанавливать значения альфа вместе с RGB.Значение альфа из исходного изображения всегда должно быть сохранено.Алгоритм таблицы поиска должен влиять только на RGB.

Хотя вы говорите, что пробовали HSL, этого нет в коде, который вы опубликовали.Вы должны выполнить раскраску в HSL, а затем преобразовать полученные цвета в RGB для вашей справочной таблицы, так как это сохранит исходную яркость оттенков серого.Создание вашей таблицы поиска может выглядеть примерно так:

short H = ??; // your favorite hue
short S = ??; // your favorite saturation
for (short i = 0; i < 256; i++) {
    if (i < 30 || i > 226) {
        red[i] = green[i] = blue[i] = i; // don't do alpha here
    }
    else {
        HSL_to_RGB(H, S, i, red[i], green[i], blue[i])
    }
}

Примечание: вы должны предоставить функцию преобразования HSL в RGB.См. Мой ответ на Цветное изображение в оттенках серого для ссылок на исходный код.

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