2016-06-14 5 views
1

작은 페인트 도구를 개발 중입니다. 그리고 이미지에 선이나 원 및 기타 모양을로드하고 그릴 수 있습니다. 또한 나는 그려진 도형을 지우는 지우개 도구가 있습니다.
이 그에 대한 코드입니다 :이미지에 그려진 도형을 삭제하는 방법

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

내 문제는, 그 나는 이미지를로드되고 일부 모양을 그린 경우. 그런 다음 모양을 지우려고 할 때 이미지가 흰색으로 바뀝니다.
fillRect()을 사용하여 모양을 지우는 동안 이미지를 배경으로 설정하는 방법이 없으므로 내 이미지는 변경되지 않습니다.

+0

그래픽에서 다른 작업을하기 전에 g.drawImage (XXX)를 호출하고 싶습니다. 2d –

+0

예, 이미 처리 중입니다. 그러나 문제는 여전히 있습니다. –

+0

2 개의 이미지가 하나씩 그려져 있어야합니다. 첫 번째는 소스 이미지입니다. 두 번째는 선/도형이있는 이미지입니다. 지우고 싶다면 두 번째 이미지에 rect를 채워야합니다. –

답변

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

관련 문제