Java - раскраска изображения - PullRequest
       16

Java - раскраска изображения

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 31 октября 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).

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

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

Вы пытаетесь изменить изображение серого канала (бело-черный) на (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 .

...