2014-01-29 103 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

相關問題