从mouses X和Y位置获取bufferedImage的像素RGB [英] Getting pixel RGB from a bufferedImage from the mouses X and Y position

查看:148
本文介绍了从mouses X和Y位置获取bufferedImage的像素RGB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作带图像的彩色选择器程序。程序首先加载到图像中,然后当您将鼠标悬停在图像上时,它将获得鼠标X和Y位置的当前像素RGB值。我已经设置了框架并加载了它们的图像,有人可以帮助我使用像素吗?

I am making a color chooser program with an image. The program first loads in the image and then when you hover over the image, it will get the current pixels RGB value off of the mouses X and Y position. I have set up the frame and loaded them image, can someone help me get it working with the pixels?

package net.ogpc.settings;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.io.File;
import java.io.IOException;

public class ColorChooser implements Runnable, MouseListener{
    public static String path = "FileIO Plug-Ins\\Resources\\color-picker.png";
    public static boolean running = false;
    public static String r = "100";
    public static String g = "100";
    public static String b = "100";
    JFrame frame = new JFrame("Choose A Color");
    JTextField JR = new JTextField();
    JTextField JG = new JTextField();
    JTextField JB = new JTextField();
    Container colorImage = new Container();
    Container east = new Container();
    public ColorChooser() {
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
        frame.setResizable(false);
        //set up JFrame
        east.setLayout(new GridLayout(3, 3));
        east.add(JR);
        east.add(JG);
        east.add(JB);
        frame.add(east);
        //import the color chooser image
        Import();
        frame.setVisible(true);
        running = true;
        run();
    }
    public void run() {
        while (running) {
            getPixel();
            try {
                    Thread.sleep(250);
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    public void getPixel() {

        //get it m9!
        JR.setText(r);
        JG.setText(g);
        JB.setText(b);      
        System.out.println("r: " + r + " g: " + g + " b: " + b);
    }
    public void Import() {
        colorImage.setLayout(new FlowLayout());
        try {
            File file = new File(path);
            BufferedImage image;
            image = ImageIO.read(file);
            JLabel label = new JLabel(new ImageIcon(image));
            label.addMouseListener(this);
            colorImage.add(label, BorderLayout.NORTH);
            frame.getContentPane().add(colorImage, BorderLayout.WEST);
        } catch (IOException ex) {
                ex.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new ColorChooser();
    }
    public void mouseClicked(MouseEvent arg0) {
    }
    public void mouseEntered(MouseEvent arg0) {
    }
    public void mouseExited(MouseEvent arg0) {
    }
    public void mousePressed(MouseEvent arg0) {
        //each time you click on the image... print out the pixel RGB here

    }
    public void mouseReleased(MouseEvent arg0) {
    }
}


推荐答案

您的 while-loop 让我害怕,它说您可能无法理解Swing或事件驱动的环境如何工作。缺点是,你不需要它,将来也不应该使用这种技术......

Your while-loop scares me, it says that you may not understand how Swing or event driven environments work. The short of it is, you don't need it, nor should you use this kind of technique in the future...

基本上,你需要访问权限到图像的 BufferedImage 实例,因为它提供了对底层栅格数据的访问。

Basically, you are going to need access to a BufferedImage instance of the image, as this provides access to the underlying raster data.

如果你小心使用您的布局,您可以使用 JLabel 来显示图像,只需向其添加 MouseMotionListener 并监控鼠标移动,拿起 int 下面像素的颜色。

If you are careful with your layouts, you can use a JLabel to display the image and simply add a MouseMotionListener to it and monitor the mouse movements, picking up the packed int color of the pixel below it.

然后你需要翻译这个包装 int 成RGB值。现在你可以做一些操作,但说实话,使用 Color(int)更简单。

You will then need to translate this packed int into RGB values. Now you could do some bit manipulation, but to be honest, using Color(int) is simpler.

< img src =https://i.stack.imgur.com/8FKzx.pngalt =在此处输入图像说明>

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class ColorPicky {

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

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

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

    public class TestPane extends JPanel {

        private BufferedImage img;
        private JLabel label;

        private JPanel fields;
        private JTextField red;
        private JTextField green;
        private JTextField blue;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            label = new JLabel();
            try {
                img = ImageIO.read(new File("C:\\hold\\thumbnails\\issue459.jpg"));
                label.setIcon(new ImageIcon(img));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            add(label, gbc);

            fields = new JPanel();
            fields.setBorder(new EmptyBorder(5, 5, 5, 5));
            red = new JTextField(3);
            green = new JTextField(3);
            blue = new JTextField(3);
            fields.add(red);
            fields.add(green);
            fields.add(blue);
            add(fields, gbc);

            label.addMouseMotionListener(new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    int packedInt = img.getRGB(e.getX(), e.getY());
                    Color color = new Color(packedInt, true);
                    fields.setBackground(color);
                    red.setText(Integer.toString(color.getRed()));
                    green.setText(Integer.toString(color.getGreen()));
                    blue.setText(Integer.toString(color.getBlue()));
                }
            });

        }

    }

}

我想你可能想花一些时间阅读......

I think you might like to spend some time reading through...

  • Creating a GUI in Swing
  • Concurrency in Swing
  • BufferedImage JavaDocs

这篇关于从mouses X和Y位置获取bufferedImage的像素RGB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆