2016-06-14 58 views
1

我正在开发一个小型绘图工具。我可以在图像上加载和绘制线条或圆圈以及其他形状。此外,我有一个橡皮擦工具来擦除我绘制的形状。
这是代码为:如何删除图像上绘制的形状

g.setColor(getColor().WHITE); 
g.fillRect(getXAxis() - getThickness(), getYAxis() - getThickness(), getThickness() * 2, getThickness() * 2); 

我的问题是,如果我已加载的图像,并在其上绘制一些形状。然后,当我试图擦除形状时,图像也被白色所取代。
在使用fillRect()擦除形状时,是否有任何方法将图像设置为背景,以便我的图像不会被触摸。

+0

我想你想在你的图形2d –

+0

上做任何其他事情之前打电话给g.drawImage(XXX)是的,我已经在做它了。但问题仍然存在 –

+0

您需要将2幅图像叠加在一起。首先是你的源图像。其次是你的线条/形状的图像。如果你想删除一些东西,你需要在你的第二张图片上填充一个不透明的颜色。 –

回答

2

这里是例子。为了测试它,你需要用你的背景图像替换我的图像。

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 

/** 
* <code>PaintTryout</code>. 
* 
* @author smedvynskyy 
*/ 
public class PaintPanel extends JPanel { 

    private Image backgroundImage; 

    private BufferedImage paintImage; 

    public PaintPanel() { 
     try { 
      // replace this image with your image 
      backgroundImage = ImageIO.read(new File("E:\\icons\\blackboard.png")); 
      paintImage = new BufferedImage(backgroundImage.getWidth(this), 
        backgroundImage.getHeight(this), BufferedImage.TYPE_INT_ARGB); 
     } catch (final Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public void fillRect() { 
     final Graphics g = paintImage.createGraphics(); 
     g.setColor(Color.RED); 
     g.fillRect(0, 0, 50, 50); 
     g.dispose(); 
     repaint(); 
    } 

    public void clearRect() { 
     final Graphics2D g = paintImage.createGraphics(); 
     g.setColor(new Color(0, 0, 0, 0)); 
     g.setComposite(AlphaComposite.Clear); // overpaint 
     g.fillRect(0, 0, 50, 50); 
     g.dispose(); 
     repaint(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(backgroundImage, 0, 0, this); 
     g.drawImage(paintImage, 0, 0, this); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(backgroundImage.getWidth(this), 
       backgroundImage.getHeight(this)); 
    } 

    public static void main(String[] args) { 
     final JFrame frm = new JFrame("Tesp paint"); 
     final PaintPanel p = new PaintPanel(); 
     frm.add(p); 
     final JPanel buttons = new JPanel(); 
     final JButton fill = new JButton("Fill Rect"); 
     fill.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       p.fillRect(); 
      } 
     }); 
     final JButton clear = new JButton("Clear Rect"); 
     clear.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       p.clearRect(); 
      } 
     }); 
     buttons.add(fill); 
     buttons.add(clear); 
     frm.add(buttons, BorderLayout.SOUTH); 
     frm.pack(); 
     frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frm.setLocationRelativeTo(null); 
     frm.setVisible(true); 
    } 
} 
+0

Medvyncskyy使用上述解决方案,当我尝试删除某些东西时,我会看到黑色矩形 –

+0

您应该只修改'paintImage' –

+0

它工作正常与上面的例子。但是,当我在我的代码中使用它来修改缓冲图像时,我得到了黑色的彩色矩形。 –

0

这样做的简单方法是在XOR模式下画线。然后,要抹去它们,你只需再次绘制它们。

+0

在这种情况下,我们不会得到一条固定的彩色线,而是一条XOR像素线。 –

+0

在这种情况下,整行将被删除或添加。但使用橡皮擦,我们应该有能力擦除线的特定部分。在这种情况下,这可能不起作用 –

+0

@SaikiranGosikonda不,在这种情况下,重画的任何部分都将被删除。 – EJP

相关问题