Ява - Раскрашивание изображения

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

Спасибо за любую помощь.

например http://dl.dropbox.com/u/17664230/ruka.png


person Aadam    schedule 30.10.2011    source источник
comment
Вы имеете в виду, что хотите, чтобы фон изображения менял цвет? Если это так, вы должны взглянуть на прозрачность.   -  person toto2    schedule 31.10.2011
comment
Неа. Я хочу, чтобы серое изображение меняло цвет следующим образом: dl.dropbox.com/u/17664230/ рука.png   -  person Aadam    schedule 31.10.2011
comment
Вы где-нибудь используете ImageFilter? Это то, что работало для меня в прошлом. На самом деле, какой код вы сейчас пытаетесь использовать?   -  person Hovercraft Full Of Eels    schedule 31.10.2011
comment
Я использую этот код для получения цвета int pastebin.com/YRYmLrBz   -  person Aadam    schedule 31.10.2011


Ответы (2)


Вы пытаетесь изменить серый канал изображения (бело-черный) на (some_color-black)?

public void recolor(BufferedImage source, BufferedImage destination, int color) {
    WritableRaster destinationRaster = destination.getRaster();
    Raster sourceRaster = source.getRaster();
    //red, green, blue
    int channels = new int[]{color & 0xFF0000, color & 0xFF00, color & 0xFF};

    for (int channel=0; channel<3; channel++){
        for (int y=0; y<sourceRaster.getHeight(); y++) {
            for (int x=0; x<rangeSlicer.getWidth(); x++) {
                pixel = sourceRaster.getSample(x, y, channel);
                pixel = Math.round((double)pixel/255.0 * channels[channel]);
                destinationRaster.setSample(x, y, channel, pixel);
            }
        }
    }
}

Не уверен, что это компилируется, но идея такова. Для более эффективной работы программы проверьте RescaleOp.

person Dalius Šidlauskas    schedule 30.10.2011
comment
Нет, просто я просто хочу раскрасить спрайтом заданного цвета, как один из этих на спрайт-листе: bit.ly/vcHsdl - person Aadam; 31.10.2011
comment
Я пробовал это, но это не работает. Цвет меняет, но не правильно. Я бы предпочел методы BufferedImage, такие как getRGB и setRGB. Мне просто нужно знать, что делать с цветами, сливаться? Умножить? Добавить их? - person Aadam; 31.10.2011
comment
getRGB возвращает целочисленное значение, которое представляет 4 канала [альфа, регистр, зеленый, синий]. Все каналы имеют значения в диапазоне 0-255. (Ваше входное изображение имеет оттенки серого, поэтому красный, зеленый и синий каналы имеют одинаковое значение в диапазоне 0-255). Чтобы получить раскрашенный результат, вам нужно умножить каждый канал отдельно на один и тот же канал данного цвета и разделить на 255. Входные каналы изображения будут использоваться в качестве уровня интенсивности для используемых вами цветовых каналов. Оставьте альфа-канал без изменений. - person Dalius Šidlauskas; 02.11.2011

Я бы определил некоторые alpha = 0.2 и сделал:

given gray #777777
make redder with: 
                  new red = 77 * (1.0 + alpha)
                  new green = blue = 77 * (1.0 - alpha)

На самом деле, вы должны быть осторожны и обязательно обрезать (1 + альфа) и (1 - альфа) так, чтобы вы использовали только значения от 0 до 1,0. Используйте Math.min(0.0, 1.0 - альфа) вместо (1.0 - альфа) и Math.max(1.0, 1.0 + альфа) вместо (1.0 + альфа).

С этой формулой, если вам дали черный цвет (#000000), он останется черным. Если вам дали белый цвет (#FFFFFF), он станет розовым (#FFCCCC). Если вы установите альфа = 1.0, белый цвет станет чисто красным (#FF0000).

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

person toto2    schedule 31.10.2011