本文介绍了如何仅使用java.io. *将颜色转换为Java中的灰度?图书馆?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

好吧,我明白了..因为在我这个地方,他们这样要求..好吧,我有这个:///有些变量和注释是可能的代码..但是我的意思是我不知道该怎么做,我在互联网上发现要转换R是字节在* 0.21中,而G是* 0.71我猜是蓝色是* 0.07.我只能使用该库java.io. *;我正在使用1024 x 768的BMP格式图像,如果您可以帮助我,或者您想让我更具体,请告诉我.我不知道我是否必须添加其他变量或删除某些变量或进行修改,请帮助我.我不是那种语言的新手,但我不是专家.代码就在这里:

Well, i got this.. cause in my place they request it like that.. Well i have this://some variables and coments are a possible code.. But i mean i don't know how to do it exactly, i found on internet that to convert R is the byte is in *0.21 with G is *0.71 i guess and blue is * 0.07. I just can use that library java.io.*; and i'm working with BMP format images of 1024 x 768, if you can help me, or you want me to be more specific please tell me. i don't know if i have to add another variables or to take some out, or to modify, please help me. I'm not so new in this language, but i'm not an expert. The code is right here:

导入java.io.*;

import java.io.*;

公共类灰度{

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

}

推荐答案

大多数图像格式在像素数据之前都具有标头信息,因此在读取这些类型的文件时,需要考虑到这一点...

Most image formats have header information before the pixel data, so when you're reading these types of files, you need to take that into consideration...

坦率地说,在可能的情况下依赖现有的库要容易得多.

Frankly, it's much easier to rely on pre-existing library where you can.

ImageIO 允许您读取和写入许多不同的文件格式,包括BMP.

ImageIO allows you to read and write a number of different file formats, including BMP.

看看

下一个决定是-您自己转换图像还是使用预先存在的滤镜.您必须做一些自己的指标,但是在过去,我发现对图像的像素操作速度很慢,至少比内置滤镜要慢...

The next decision is - do you convert the image yourself or use a pre-existing filter. You'll have to do some of your own metrics, but in the past, I've found pixel manipulation of an image to be slow, slower than the in built filters at the very least...

原始,手动灰度,自动/滤镜灰度

Original, manual grayscale, automatical/filter grayscale

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

现在,编写图像(上面没有演示)将非常简单...

Now, writing the image (which is not demonstrated above) would be as simple as...

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

这篇关于如何仅使用java.io. *将颜色转换为Java中的灰度?图书馆?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-07 01:25