2014-01-29 100 views
0

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

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

任何帮助是伟大的!

+0

你的'while-loop'让我害怕。确保你了解[Swing的工作原理](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – MadProgrammer

+0

你也看看这个[示例](https://stackoverflow.com/问题/ 17983560/rgb-retrieval-of-a-color-image/17983691#17983691)一些想法 – MadProgrammer

回答

3

你的while-loop吓到我了,它说你可能不了解Swing或事件驱动环境是如何工作的。简而言之,你不需要它,也不应该在将来使用这种技术......

基本上,你将需要访问图像的BufferedImage实例,因为这提供了访问底层的栅格数据。

如果你小心你的布局,您可以使用JLabel显示图像,只需添加一个MouseMotionListener它和监视鼠标移动,拿起包装int颜色低于它的像素。

然后,您需要将此打包的int转换为RGB值。现在你可以做一些操作,但说实话,使用Color(int)更简单。

enter image description here

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

     } 

    } 

} 

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

+0

legend!................ – AngryDuck

相关问题