2016-06-01 9 views
0

私のプロジェクトで使用しているカスタムコンポーネントに問題があります。描画はうまくいきましたが、今では特定の色の最初のピクセルの座標を見つけて、それにいくつか問題があります。Javaカスタムコンポーネントのピクセルカラー

は、ここに私のコンポーネントのコードです:

class DrawPad extends JComponent { 

    private LinkedList<Line> lines = new LinkedList<>(); 

    DrawPad() { 
     setDoubleBuffered(true); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       // TODO Auto-generated method stub 
       lines.add(new Line()); 
       lines.getLast().add(e.getPoint()); 
      } 
     }); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       lines.getLast().add(e.getPoint()); 
       repaint(); 
      } 
     }); 
    } 

    void clear() { 
     lines.clear(); 
     repaint(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.BLACK); 
     if (!lines.isEmpty()) { 
      for (Line line : lines) { 
       // TODO 
       LinkedList<Point> points = line.getPoints(); 
       Point previous = points.getFirst(), current = previous; 
       for (int i = 1; i < points.size(); i++) { 
        current = points.get(i); 
        g.drawLine(previous.x, previous.y, current.x, current.y); 
        previous = current; 
       } 
      } 
     } 
    } 
} 

私はそれはおそらく最適化することができます知っているが、それは今それほど重要ではありません。

誰かが特定の色の最初のピクセルを検索する方法を書く手助けはできますか?

私は最近、BufferedImageで何かをしなければならないことを知りましたが、実装方法はわかりません。どんな助けもありがとう。

答えて

1

BufferedImageにペイントし、find()のピクセルをREDに設定します。他のピクセルの上にマウスを置くと、下にある色が表示されます。

System.out.println(find(Color.RED)); 
… 
private Point find(Color color) { 
    for (int r = 0; r < imgH; r++) { 
     for (int c = 0; c < imgW; c++) { 
      if (img.getRGB(c, r) == color.getRGB()) { 
       System.out.println(c + "," + r + ": " 
        + String.format("%08X", img.getRGB(c, r))); 
       return new Point(c, r); 
      } 
     } 
    } 
    return new Point(-1 , -1); 
} 

image

コンソール:

32,32: FFFF0000 
java.awt.Point[x=32,y=32] 

コード:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

/** 
* @see http://stackoverflow.com/a/37574791/230513 
* @see http://stackoverflow.com/questions/2900801 
*/ 
public class Grid extends JPanel { 

    private static final int SCALE = 8; 
    private final BufferedImage img; 
    private int imgW, imgH, paneW, paneH; 

    public Grid(String name) { 
     Icon icon = UIManager.getIcon(name); 
     imgW = icon.getIconWidth(); 
     imgH = icon.getIconHeight(); 
     img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = (Graphics2D) img.getGraphics(); 
     icon.paintIcon(null, g2d, 0, 0); 
     g2d.dispose(); 
     img.setRGB(imgW/2, imgH/2, Color.RED.getRGB()); 
     this.addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       Point p = e.getPoint(); 
       int x = p.x * imgW/paneW; 
       int y = p.y * imgH/paneH; 
       int c = img.getRGB(x, y); 
       setToolTipText(x + "," + y + ": " 
        + String.format("%08X", c)); 
      } 
     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(imgW * SCALE, imgH * SCALE); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     paneW = this.getWidth(); 
     paneH = this.getHeight(); 
     g.drawImage(img, 0, 0, paneW, paneH, null); 
     System.out.println(find(Color.RED)); 
    } 

    private Point find(Color color) { 
     for (int r = 0; r < imgH; r++) { 
      for (int c = 0; c < imgW; c++) { 
       if (img.getRGB(c, r) == color.getRGB()) { 
        System.out.println(r + "," + c + ": " 
         + String.format("%08X", img.getRGB(c, r))); 
        return new Point(c, r); 
       } 
      } 
     } 
     return new Point(-1 , -1); 
    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new Grid("OptionPane.informationIcon")); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
関連する問題