2016-06-14 5 views
1

Je développe un petit outil de peinture. Et je suis capable de charger et de dessiner des lignes ou des cercles et d'autres formes sur une image. J'ai aussi un outil gomme pour effacer les formes que j'ai dessinées.
Ce code est que:Comment supprimer des formes dessinées sur une image

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

Mon problème est que, si je l'ai chargé une image et dessiné des formes sur elle. Puis quand j'ai essayé d'effacer les formes, l'image est également remplacée par la couleur blanche.
Y at-il un moyen de définir l'image comme arrière-plan tout en utilisant fillRect() pour effacer la forme, afin que mon image ne soit pas touchée.

+0

Je pense que vous voulez appeler g.drawImage (XXX) avant de faire quoi que ce soit d'autre sur vos graphiques 2d –

+0

oui, je le fais déjà. Mais le problème est toujours là –

+0

Vous avez besoin de 2 images dessinées les unes sur les autres. La première est votre image source. La deuxième est l'image avec vos lignes/formes. Si vous voulez effacer quelque chose, vous devez remplir rect sur votre deuxième image avec une couleur transparente. –

Répondre

2

Voici l'exemple. Pour le tester, vous devez remplacer mon image avec votre image de fond.

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 En utilisant la solution ci-dessus, quand j'essaie d'effacer quelque chose, je reçois des rectangles de couleur noire –

+0

Vous devez seulement modifier le 'paintImage' –

+0

Cela fonctionne bien avec l'exemple ci-dessus. Mais, quand je l'utilise dans mon code pour modifier l'image tamponnée, je reçois des rectangles de couleur noire. –

0

La façon facile de le faire est de tracer les lignes en mode XOR. Ensuite, pour les effacer, il suffit de les dessiner à nouveau.

+0

Dans ce cas, nous n'obtiendrons pas une ligne de couleur uni, mais une ligne XOR-pixel. –

+0

Dans ce cas, toute la ligne sera supprimée ou ajoutée. Mais en utilisant gomme, nous devrions avoir la possibilité d'effacer une partie particulière de la ligne aussi. Dans ce cas, cela peut ne pas fonctionner. –

+0

@SaikiranGosikonda Non, dans ce cas, la partie de la ligne que vous avez redessinée sera effacée. – EJP