2016-07-12 8 views
-1

Мне нужна моя программа, чтобы пройти через пиксели в изображении, изменить их на шкалу серого. Затем мне нужно взять ряд серых значений и раскрасить их, используя инструкции if-else и if-else-if. Может кто-нибудь, пожалуйста, помогите мне понять это?Как назначить новые значения цвета диапазонам цветов

Вот мой код до сих пор:

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 

public class Colorize { 

    BufferedImage image; 
    int width; 
    int height; 

    public Colorize() { 
     try { 
      File input = new File("Grayscale.jpg"); 
      image = ImageIO.read(input); 
      width = image.getWidth(); 
      height = image.getHeight(); 

      for(int i=0; i<height; i++){ 

       for(int j=0; j<width; j++){ 
        int col = image.getRGB(i, j); 
        Color c = new Color(col, true); 
        int red = c.getRed(); 
        int green = c.getGreen(); 
        int blue = c.getBlue(); 
        if ((red>= 1)&&(red<=30)) { 
         c = new Color(c.getRed() + 10, c.getGreen(), c.getBlue()); 
        } 
        if ((red>= 31)&&(red<=60)) { 
         c = new Color(c.getRed(), c.getGreen() + 10, c.getBlue()); 
        } 
        if ((red>= 61)&&(red<=90)) { 
         c = new Color(c.getRed(), c.getGreen(), c.getBlue() + 10); 
        } 
        if ((red>= 91)&&(red<=120)) { 
         c = new Color(c.getRed() + 10, c.getGreen() + 10, c.getBlue()); 
        } 
        if ((red>= 121)&&(red<=150)) { 
         c = new Color(c.getRed() + 10, c.getGreen(), c.getBlue() + 10); 
        } 
        if ((red>= 151)&&(red<=180)) { 
         c = new Color(c.getRed(), c.getGreen() + 10, c.getBlue() + 10); 
        } 
        if ((red>= 181)&&(red<=210)) { 
         c = new Color(c.getRed() - 10, c.getGreen(), c.getBlue()); 
        } 
        if ((red>= 211)&&(red<=240)) { 
         c = new Color(c.getRed(), c.getGreen() - 10, c.getBlue()); 
        } 
        else { 
         c = new Color(c.getRed(), c.getGreen(), c.getBlue()); 
        } 
        image.setRGB(j,i,c.getRGB()); 
       } 
      } 

      File output = new File("Colorize.jpg"); 
      ImageIO.write(image, "jpg", output); 

     } catch (Exception e) {} 
    } 

    static public void main(String args[]) throws Exception 
    { 
     Colorize obj = new Colorize(); 
    } 
} 

Вот изображение в случае, если вы, ребята, хотите попробовать код из. Пока ничего не записывается в папку.

enter image description here

+0

Что делает код до сих пор? Скомпилирует ли он? – halfer

+0

Как вы хотите раскрасить свое изображение в оттенках серого? – eldo

+0

Смотрите ниже. Я нашел проблему в коде. – Coder02983409

ответ

1

Там должно быть исключение где-то, к сожалению, вы ловите исключение и ничего не делать.

Заменить

catch (Exception e) {} 

с

catch (Exception e) { 
    e.printStackTrace(); 
} 

Это поможет вам найти то, что происходит. Я предполагаю, что вы получите FileNotFoundException, потому что Grayscale.jpg, вероятно, не находится в вашем рабочем каталоге.

+0

Я не получаю сообщение об ошибке. Он просто не сохраняет новое изображение в папке. – Coder02983409

+0

Как вы можете быть уверены, что нет ошибки, так как вы ничего не делаете в случае ошибки? Если ошибки не было, вы должны хотя бы записать файл назначения, равный исходному файлу. – StephaneM

+0

Вот ошибка, которую я получаю сейчас: java.lang.ArrayIndexOutOfBoundsException: Координация вне границ! at sun.awt.image.ByteInterleavedRaster.getDataElements (ByteInterleavedRaster.java:318) at java.awt.image.BufferedImage.getRGB (BufferedImage.java:917) at Colorize. (Colorize.java:23) на Colorize.main (Colorize.java:72) на __SHELL27.run (__ SHELL27.java:6) в sun.reflect.NativeMethodAccessorImpl.invoke0 (метод Native) при sun.reflect. NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) – Coder02983409

0

Чтобы преобразовать изображение в оттенки серого, вам нужны ваши цвета. Средневзвешенный. 0,2126 г 0,7152 г 0,0722 б. Получение цветов таким же образом, как и getRed() getGreen() и getBlue(). Наконец, добавьте свои цвета и установите его с помощью setRGB. Это превратит ваше изображение в оттенки серого.

for(int i=0; i<image.getWidth(); i++){ 
     for(int j=0; j<image.getHeight(); j++){ 
      int color = image.getRGB(i,j); 
      int r = ((color >> 16) & 0xFF) * 0.2126; 
      int g = ((color >> 8) & 0xFF) * 0.7152; 
      int b = ((color) & 0xFF) * 0.0722; 
      int finalColor = (r << 16) | (g << 8) | b; 
      image.setRGB(i,j,finalColor); 
     } 
} 

Редактировать свой вопрос с дополнительной информацией о вашей окраске, чтобы я мог больше помочь.

 Смежные вопросы

  • Нет связанных вопросов^_^