如何复制bufferedImage

我写了下面的例子,给出了我可能遇到的问题。 当您按下按钮时,controlWhichImage切换为2.问题是当它从原始图像切换到副本时图像消失。

public class PainterDemo01 extends JPanel implements ActionListener { BufferedImage createdImage; BufferedImage img; int controlWhichImage; JFrame mainFrame; JButton changePicture; public PainterDemo01(){ changePicture = new JButton("Press"); changePicture.addActionListener(this); controlWhichImage = 1; mainFrame = new JFrame(); mainFrame.add(this); this.add(changePicture); mainFrame.setPreferredSize(new Dimension(600,600)); mainFrame.setVisible(true); mainFrame.pack(); img = loadImage(); } public BufferedImage loadImage(){ img = null; try { img = ImageIO.read(new File("/home/gerry/Desktop/100_0647.JPG")); } catch (IOException e){ System.out.println("no file here"); } return img; } @Override protected void paintComponent(Graphics g){ super.paintComponent(g); loadImage(); if (createdImage == null){ this.createdImage = new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_ARGB); } Graphics g2 = this.createdImage.getGraphics(); if (controlWhichImage == 1){ g2.drawImage(img,0,0,img.getWidth(),img.getHeight(),null); g.drawImage(img, 0,0,img.getWidth(),img.getHeight(),null); g2.dispose(); } if (controlWhichImage == 2){ //Draw bufferedImage on to to JPanel g.drawImage(this.createdImage,this.createdImage.getWidth(),this.createdImage.getHeight(),null); } } @Override public void actionPerformed(ActionEvent e){ controlWhichImage = 2; repaint(); } public static void main(String[] args) { // TODO code application logic here java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new PainterDemo01().setVisible(true); } }); } } 

当然! 你必须去郊外画画。 请用这个

 g.drawImage(this.createdImage, 0, 0, this.createdImage.getWidth(),this.createdImage.getHeight(),null); 

问题是getGraphics (或更好名为createGraphics )在if语句之外调用,也是2,因此两者都导致资源泄漏(因为没有g2.dispose ),也是一个干净的平板。

  if (controlWhichImage == 1) { Graphics g2 = createdImage.getGraphics(); g2.drawImage(img,0,0,img.getWidth(),img.getHeight(),null); g2.dispose(); } 

还要做一些事情,比如在油漆代码之外加载图像。

如果您想知道如何复制BufferedImage,请参阅此问题: 如何复制BufferedImage

使用img obj,因为它已经实例化但不是createdImage obj, createdImage包含null因为它刚刚声明但未实例化。 如果使用createdImage obj意味着如果对createdImage obj执行任何操作,那么您将获得NullPointerException

 Graphics g2 = this.img.getGraphics(); ---------