2016-06-01 2 views
0

내 프로젝트에서 사용중인 일부 맞춤 구성 요소에 문제가 있습니다. 그리기에는 문제가 없지만, 이제는 특정 색상의 첫 번째 픽셀 좌표를 찾고 일부 문제가 발생합니다.자바 맞춤 구성 요소 픽셀 색상

여기 내 구성 요소 코드 :

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

아래의 예는 IconBufferedImage에 페인팅하고 find()에 대해 픽셀을 설정합니다. 마우스를 다른 픽셀 위로 가져 가면 기본 색상을 볼 수 있습니다.

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