[英]Java custom component pixel color
我在項目中使用的某些自定義組件遇到了麻煩。 它的繪制效果很好,但是現在我想找到某種顏色的第一個像素的坐標,並遇到一些麻煩。
這是我的組件代碼:
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
做一些事情,但是不知道如何實現它。 任何幫助,將不勝感激。
下面的示例將Icon
繪制到BufferedImage
並設置一個RED
像素,供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);
}
安慰:
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();
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.