Gerry
Gerry

Reputation: 79

How to copy bufferedImage

I have written the following example to give something runnable of a problem I am having. When you press the button the controlWhichImage switches to 2. The problem is that when it switches from the original image to a copy the image disappears.

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);
            }
        });
    }    
}

Upvotes: 0

Views: 1116

Answers (4)

gpasch
gpasch

Reputation: 2682

Of course! You have to go and paint the image at the outskirts. Please use this

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

Upvotes: 0

SilentStorm
SilentStorm

Reputation: 149

See this question if you want to know how to copy an BufferedImage: How to copy BufferedImage

Upvotes: 1

Joop Eggen
Joop Eggen

Reputation: 109547

The problem is that getGraphics (or better named createGraphics) is called outside the if statement, also for 2, hence both causing a resource leak (as no g2.dispose is called), and also a clean slate.

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

Also do things like loading the image outside the paint code.

Upvotes: 1

SatyaTNV
SatyaTNV

Reputation: 4135

Use img obj since its already instantiated but not createdImage obj, createdImage contains null since its just declared but not instantiated. If you use createdImage obj means if you perform any operation upon createdImage obj then you will get NullPointerException.

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

Upvotes: 0

Related Questions