2013-09-10 3 views
1

Ну, я получил это .. потому что на моем месте они просят его вот так .. Ну, у меня есть это: // некоторые переменные и комменты - это возможный код .. Но я имею в виду, что я не знаю, как это сделать точно, я нашел в Интернете, что для преобразования R - это байт в * 0.21 с G - это * 0.71, я думаю, и синий - это 0.07. Я просто могу использовать эту библиотеку java.io. *; и я работаю с изображениями в формате BMP 1024 x 768, если вы можете мне помочь, или вы хотите, чтобы я был более конкретным, скажите мне. Я не знаю, нужно ли мне добавлять другие переменные или брать некоторые из них или изменять, пожалуйста, помогите мне. Я не так новичок в этом языке, но я не эксперт. Код находится здесь:Как преобразовать цвета в оттенки серого в java только с java.io. *; библиотека?

импорт java.io. *;

общественного класс Grayscale {

FileInputStream image; 
FileOutputStream img; 
byte[] datos; 
int i; 
int cont; 

public Grayscale(String nombre)throws Exception{ 

    this.image = new FileInputStream(nombre); 
    this.img = img; 
    this.datos = new byte[image.available()]; 
    this.i = 54; 
    this.cont = 1; 
} 

public void gray()throws Exception{ 

    image.read(datos); 
    img = new FileOutputStream("grayscale.bmp"); 

    while(i<datos.length){ 
     if(cont == 1){ 
      datos[i] = datos[i] ;//* 0.21; 
      cont++; 
     } else if(cont == 2){ 
      datos[i] = datos [i] ;//* 0.71; 
      cont++; 
     } else if(cont == 3){ 
      datos[i] = datos[i] ;//* 0.07; 
      cont++; 
     }else{ 
      cont = 1; 
     } 
     i++; 
    } 
    img.write(datos); 
} 

}

ответ

2
// constant factors 
      final double GS_RED = 0.299; 
      final double GS_GREEN = 0.587; 
      final double GS_BLUE = 0.114; 

Теперь получить каждый и получ это красный, синий, зеленый компонент и альфа, если существует и умножать их с соответствующими их фактором.

R = G = B = (int)(GS_RED * R + GS_GREEN * G + GS_BLUE * B); 
-2

Для каждого пикселя у вас есть значения RGB, принимать только значение R и скопировать его в G и B. Таким образом, что каждый пиксель будет содержать значение красного в 3 RGB это приведет к тому, изображение будет серый , Пример. данные [0] = 123 // красные данные [1] = 43 // Зеленые данные [2] = 78 // голубые Тогда данные [0] = 123 данные [1] = 123 данные [2 ] = 123

+0

Это обеспечит очень светлое (или даже полностью белое) изображение для изображений с красным цветом и очень темные изображения (или даже черные), где нет красного цвета.Например, изображение CYAN (зеленый + синий) будет черным. Это не так, как работает шкала серого. – afk5min

3

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

Честно говоря, это гораздо проще полагаться по существующей библиотеке, где вы можете.

ImageIO позволяет вам читать и записывать несколько различных форматов файлов, включая BMP.

Взгляните на

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

enter image description here

Оригинал, ручной оттенки серого, автоматический/фильтр полутоновой

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.color.ColorSpace; 
import java.awt.image.BufferedImage; 
import java.awt.image.ColorConvertOp; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class GrayScaleImage { 

    public static void main(String[] args) { 
     new GrayScaleImage(); 
    } 

    public GrayScaleImage() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridLayout(0, 3)); 
      try { 
       BufferedImage master = ImageIO.read(new File("/path/to/file.bmp")); 
       BufferedImage gray = ImageIO.read(new File("/path/to/file.bmp")); 

       // Manual manipulation... 
       for (int x = 0; x < gray.getWidth(); x++) { 
        for (int y = 0; y < gray.getHeight(); y++) { 
         Color color = new Color(gray.getRGB(x, y)); 
         int red = color.getRed(); 
         int green = color.getGreen(); 
         int blue = color.getBlue(); 

         red = green = blue = (int)(red * 0.299 + green * 0.587 + blue * 0.114); 
         color = new Color(red, green, blue); 
         int rgb = color.getRGB(); 
         gray.setRGB(x, y, rgb); 
        } 
       } 

       BufferedImage grayScale = ImageIO.read(new File("/path/to/file.bmp")); 

       // Automatic converstion.... 
       ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
       op.filter(grayScale, grayScale); 

       add(new JLabel(new ImageIcon(master))); 
       add(new JLabel(new ImageIcon(gray))); 
       add(new JLabel(new ImageIcon(grayScale))); 
      } catch (IOException ex) { 
       Logger.getLogger(GrayScaleImage.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }   
} 

Теперь, записывая изображение (которое не показано выше) будет столь же просто, как ...

ImageIO.write(grayScale, "BMP", new File("/path/to/grayscale file.bmp")); 

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

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