2016-03-08 11 views
0

Я написал код Java, чтобы изменить все красные значения черно-белого изображения на 255, поэтому выход будет красным. Но его не красный, вместо этого он выводит более яркое изображение. Что я сделал не так?Java, изображение меняется на неправильные значения rgb

File bwgFile = new File("X:/Java/Documents/NetBeansProjects/colour/input/bwg.png"); 
BufferedImage bwgImage = ImageIO.read(bwgFile); 
int width=bwgImage.getWidth(); 
int height=bwgImage.getHeight(); 
for(int w=0; w<width; w++){ 
    for(int h=0; h<height; h++){ 
     int pixel = bwgImage.getRGB(w,h); 
     Color bwg = new Color(pixel); 
     int c=bwg.getRed(); 
     Color red = new Color(255,c,c); 
     int cpixel = red.getRGB(); 
     bwgImage.setRGB(w,h,cpixel); 
    } 
} 
    ImageIO.write(bwgImage, "png", new File("X:/Java/Documents/NetBeansProjects/colour/output/c.png")); 

input output

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

+0

Потому что цветные каналы указывают яркость цвета? У вас все еще есть свой зеленый и синий канал. Если вы все установили их на 255, вы получите белый цвет. – Neijwiert

+0

Я не устанавливаю их всех в 255, только красный. – ergoforce

+0

Если вы посмотрите на выходное изображение, вы увидите, что изображение не белое. (Я включил ссылки на изображения в случае, если вы не заметили.) – ergoforce

ответ

0

Если я понимаю, что вы пытаетесь сделать, вы пытаетесь создать изображение в оттенках серого, за исключением того, что оно «redscale», используя только оттенки красного. Поэтому вам нужно вычислить константу оттенка серого для каждого пикселя.

Из Википедии (Greyscale), яркость пикселя Y = 0.2126R + 0.7152G + 0.0722B. Итак, попробуйте этот

int pixel = bwgImage.getRGB(w,h); 
Color bwg = new Color(pixel); 
float c = (0.2126f * bwg.getRed() + 0.7152f * bwg.getGreen() + 0.0722f * bwg.getBlue()); 
int cc = (int)Math.round(c); 
Color red = new Color(cc, 0, 0); 
int cpixel = red.getRGB(); 
bwgImage.setRGB(w,h,cpixel); 

В качестве альтернативы, вы можете просто сохранить красный компонент и установить зеленый и синий 0. Это оставит вас с только «покраснения» каждого пикселя.

int pixel = bwgImage.getRGB(w,h); 
Color bwg = new Color(pixel); 
int c=bwg.getRed(); 
Color red = new Color(c,0,0); 
int cpixel = red.getRGB(); 
bwgImage.setRGB(w,h,cpixel); 

Примечание: Это решение выше работает только на изображениях, которые не используют IndexColorModel. Вы можете проверить цветную модель, используя BufferImage's getColorModel(). Для IndexColorModel, setRGB() не работает напрямую и вместо этого выбирает цвет в индексе, ближайшем к заданному цвету, согласно комментарию HaraldK. Для достижения желаемого результата для изображений с помощью IndexColorModel, вы можете создать новую BufferedImage с TYPE_INT_ARGB:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 

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

+0

Исключение из потока «main» java.lang.IllegalArgumentException: параметр цвета за пределами ожидаемого диапазона: красный \t at java.awt.Color.testColorValueRange (Color.java:310) \t at java.awt.Color. (Color.java:395) \t at java.awt.Color. (Color.java:369) \t at colour.Colour.main (Colour.java:50) C: \ Users \ Emma \ AppData \ Local \ NetBeans \ Cache \ 8.1 \ executor-snippets \ run.xml: 53 : Java возвращается: 1 BUILD FAILED (общее время: 0 секунд) – ergoforce

+0

@ergoforce, извините, удалил * 255 на 3-й строке. Исходные значения уже находятся в диапазоне от 0 до 255. – nitegazer2003

+0

Я также попробовал свое второе предложение, но у меня все еще есть изображение в оттенках серого, особенно более темное, чем вход, хотя значения Blue и Green должны быть равны 0 для каждого пикселя. – ergoforce