gpt4 book ai didi

Java Graphics2D 删除为 alpha 背景

转载 作者:行者123 更新时间:2023-11-30 07:18:48 25 4
gpt4 key购买 nike

我正在制作一个应用程序,它有一个绘图板,您可以在其中使用鼠标进行绘图,它在 BUfferedImage 中的标签之上进行绘制。我现在要实现的是橡皮擦,问题是我找不到任何地方可以帮助将橡皮擦制作到 clearRect() 到 alpha 背景。 (我无法定义颜色背景,因为用户可以将背景更改为他想要的任何图像)。总结:

  • 如何用 alpha 像素删除/覆盖 Graphics2D 像素?我找到的方法是使用 clearRect,但您需要指定背景颜色。

以下是我的 DrawBoard 类,其中包含要绘制的所有内容。

public class DrawBoard extends JPanel implements MouseListener, MouseMotionListener{


public JLabel status;
private JLabel imgLabel; // this is where the drawing happens
public Point pstart, pfinish;
private List<Point> points = new ArrayList<Point>();
private List<BufferedImage> lines = new ArrayList<BufferedImage>();

private static final int BI_WIDTH = 1024;
private static final int BI_HEIGHT = 800;
private static int STROKESIZE = 7;

private BufferedImage bImage = new BufferedImage(BI_WIDTH, BI_HEIGHT,
BufferedImage.TYPE_INT_ARGB);

public Color currentColor;

public static boolean eraser = false;

private int xX1, yY1;

public DrawBoard(){

Graphics2D g2d = bImage.createGraphics();
g2d.dispose();

Dimension size = getPreferredSize();
size.setSize(1024,800); //w, h
setPreferredSize(size);
//status = new JLabel("default");
//add(status, BorderLayout.SOUTH);
addMouseListener(this);
addMouseMotionListener(this);


imgLabel = new JLabel(new ImageIcon(bImage)) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
paintInLabel(g);
}
};
imgLabel.setOpaque(false);
setOpaque(false);
add(imgLabel, BorderLayout.CENTER);

}

private void paintInLabel(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getColor()); // this colour is when mouse is pressed
g2d.setStroke(new BasicStroke(STROKESIZE));
if (points.size() < 2) {
return;
}
for (int i = 1; i < points.size(); i++) {
int x1 = points.get(i - 1).x;
int y1 = points.get(i - 1).y;
int x2 = points.get(i).x;
int y2 = points.get(i).y;
g2d.drawLine(x1, y1, x2, y2);
}
}


@Override
public void mouseExited(MouseEvent e){
}

@Override
public void mouseEntered(MouseEvent e){
}

@Override
public void mouseMoved(MouseEvent e){
}

// Where the drawing happens
@Override
public void mousePressed(MouseEvent e) {
//status.setText("you pressed down the mouse");
xX1 = e.getX();
yY1 = e.getY();


points.add(e.getPoint());
}

@Override
public void mouseDragged(MouseEvent e) {
//status.setText("you draged the mouse");
points.add(e.getPoint());
imgLabel.repaint();

}

@Override
public void mouseReleased(MouseEvent e) {
//status.setText("you release the mouse click");
Graphics2D g2d = bImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getColor()); // this is the final colour
g2d.setStroke(new BasicStroke(STROKESIZE));


if (points.size() >= 2) {
for (int i = 1; i < points.size(); i++) {
int x1 = points.get(i - 1).x;
int y1 = points.get(i - 1).y;
int x2 = points.get(i).x;
int y2 = points.get(i).y;
g2d.drawLine(x1, y1, x2, y2);
}
}
g2d.dispose();

points.clear();
imgLabel.repaint();

}
// End of where the drawing happens

public void clearDrawBoard() {

}

private Color getColor() {

return ColourToolbar.selectedColor;
}

private void setColor(Color col){

this.currentColor = col;
}

@Override
public void mouseClicked(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}

}

最佳答案

你应该 set a custom Composite for your Graphics2D , 具体来说 AlphaComposite.Clear在绘制矩形之前。完成后不要忘记将合成重置为默认值 (SRC_OVER),因为将重复使用同一个 Graphics 对象来绘制其他组件。

关于Java Graphics2D 删除为 alpha 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15116608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com