Set Color as int value for use in setRGB(int x, in

2020-04-21 03:55发布

Any other errors aside, I need a way of converting my Color grayScale into an int. When I plug in the Color, I get an error. setRGB method takes an x, a y, and an rgb int as parameters. How do I change my Color into an int?

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.ImageIO;

public class Picture{
    Container content;    
    BufferedImage image, image2; 
    public Picture(String filename) {
        File f = new File(filename);
        //assume file is the image file
        try {
            image = ImageIO.read(f);
        } 
        catch (IOException e) {
            System.out.println("Invalid image file: " + filename);
            System.exit(0);
        }
    }

    public void show() {
        final int width = image.getWidth();
        final int height = image.getHeight();

        JFrame frame = new JFrame("Edit Picture"); 

        //set frame title, set it visible, etc
        content = frame.getContentPane();
        content.setPreferredSize(new Dimension(width, height));
        frame.pack();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //add a menubar on the frame with a single option: saving the image
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);
        JMenuItem saveAction = new JMenuItem("Save");
        fileMenu.add(saveAction);
        JMenuItem grayScale = new JMenuItem("Grayscale");
        fileMenu.add(grayScale);
        grayScale.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    grayscale(width, height);
                }
            });

        //add the image to the frame
        ImageIcon icon = new ImageIcon(image);
        frame.setContentPane(new JLabel(icon));

        //paint the frame
        frame.setVisible(true);
        frame.repaint();
    }

    public void grayscale(int width, int height) {
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                Color color = new Color(image.getRGB(i, j));
                int red = color.getRed();
                int green = color.getGreen();
                int blue = color.getBlue();
                int rGray = red*(1/3);
                int gGray = green*(2/3);
                int bGray = blue*(1/10);
                Color grayScale = new Color(rGray, gGray, bGray);
                image.setRGB(i,j, grayScale);
            }
        }
        show();
    }

    public static void main(String[] args) {
        Picture p = new Picture(args[0]);
        p.show();
    }
}

4条回答
Melony?
2楼-- · 2020-04-21 04:25

As per comment by trashgod.

Gray Scale image

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.image.*;

public class Picture{
    Container content;
    BufferedImage image;
    BufferedImage  image2;
    public Picture(BufferedImage image) {
        this.image = image;
        grayscale();
    }

    public void show() {
        JFrame frame = new JFrame("Edit Picture");

        //set frame title, set it visible, etc
        content = frame.getContentPane();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //add the image to the frame
        ImageIcon icon = new ImageIcon(image2);
        frame.setContentPane(new JLabel(icon));
        frame.pack();

        //paint the frame
        frame.setVisible(true);
    }

    public void grayscale() {
        // create a grayscale image the same size
        image2 = new BufferedImage(
            image.getWidth(),
            image.getHeight(),
            BufferedImage.TYPE_BYTE_GRAY);

        // convert the original colored image to grayscale
        ColorConvertOp op = new ColorConvertOp(
            image.getColorModel().getColorSpace(),
        image2.getColorModel().getColorSpace(),null);
        op.filter(image,image2);
        show();
    }

    public static void main(String[] args) {
        int size = 120;
        int pad = 10;
        BufferedImage bi = new BufferedImage(
            size,
            size,
            BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0,0,size,size);
        g.setColor(Color.YELLOW);
        g.fillOval(pad,pad,size-(2*pad),size-(2*pad));
        g.dispose();

        Picture p = new Picture(bi);
        p.show();
    }
}
查看更多
何必那么认真
3楼-- · 2020-04-21 04:30

The color is an Object. An rgb is an int. Use colorName.getRGB() to get the integer RGB value of that color.

查看更多
干净又极端
4楼-- · 2020-04-21 04:38
image.setRGB(i, j, grayScale.getRGB());
查看更多
smile是对你的礼貌
5楼-- · 2020-04-21 04:45

Take a look at what values (1/3), (2/3), and (1/10) actually have, then note that you are multiplying your red, green, and blue values by those numbers.

查看更多
登录 后发表回答