如何使用java.io. *将java中的颜色转换为灰度;图书馆?

时间:2013-09-10 04:08:34

标签: java bitmapimage grayscale

嗯,我得到了这个......因为在我的位置他们要求那样..我有这个: //一些变量和coments是一个可能的代码..但我的意思是我不知道该如何做到这一点,我发现在互联网上转换R是字节在* 0.21与G是* 0.71我猜和蓝色是* 0.07。我只能使用该库java.io. *;我正在使用1024 x 768的BMP格式图像,如果你能帮助我,或者你想让我更具体,请告诉我。我不知道我是否需要添加其他变量或取出一些,或修改,请帮助我。我用这种语言不是那么新,但我不是专家。代码就在这里:

import 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);
}

}

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:2)

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

现在检索每个并获取它的红色,蓝色,绿色成分和alpha(如果存在)并将它们与相应的因子相乘。

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

答案 2 :(得分:-2)

对于每个像素,您都有RGB值,只取R值并将其复制到G和B.这样每个像素将包含3 RGB中的红色值,这将导致图像变灰。 例。     data [0] = 123 //红色     数据[1] = 43 //绿色     数据[2] = 78 //蓝色 然后     data [0] = 123     数据[1] = 123     数据[2] = 123