How do you clone a BufferedImage

JavaCopyCloneBufferedimage

Java Problem Overview


I have an object which has many bufferedimages in it, I want to create a new object copying all the bufferedimages into the new object, but these new images may be altered and i don't want the original object images to be altered by altering the new objects images.

is that clear?

Is this possible to do and can anyone suggest a good way to do it please? I have thought of getSubImage but read somewhere that any changes to the subimage are relected back to the parent image.

I just want to be able to get a fresh entirely separate copy or clone of a BufferedImage

Java Solutions


Solution 1 - Java

Something like this?

static BufferedImage deepCopy(BufferedImage bi) {
 ColorModel cm = bi.getColorModel();
 boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
 WritableRaster raster = bi.copyData(null);
 return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}

Solution 2 - Java

I do this:

public static BufferedImage copyImage(BufferedImage source){
	BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
	Graphics g = b.getGraphics();
	g.drawImage(source, 0, 0, null);
	g.dispose();
	return b;
}

It works fairly well and it is simple to use.

Solution 3 - Java

The previously mentioned procedure fails when applied to sub images. Here is a more complete solution:

public static BufferedImage deepCopy(BufferedImage bi) {
    ColorModel cm = bi.getColorModel();
    boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
    WritableRaster raster = bi.copyData(bi.getRaster().createCompatibleWritableRaster());
    return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}

Solution 4 - Java

Another way is to use the Graphics2D class to draw the image onto a new blank image. This doesn't really clone the image, but it results in a copy of the image being produced.

public static final BufferedImage clone(BufferedImage image) {
	BufferedImage clone = new BufferedImage(image.getWidth(),
			image.getHeight(), image.getType());
	Graphics2D g2d = clone.createGraphics();
	g2d.drawImage(image, 0, 0, null);
	g2d.dispose();
	return clone;
}

Solution 5 - Java

I know that this question is pretty old, but for future visitors, here's the solution I'd use:

Image oldImage = getImage();
Image newImage = oldImage.getScaledInstance(oldImage.getWidth(null), oldImage.getHeight(null), Image.SCALE_DEFAULT);

Please correct me if changing the just obtained newImage also affects the original image in any way.
--> Javadoc for getScaledInstance
--> Javadoc for SCALE_DEFAULT (the other constants are listed just below that one)

Solution 6 - Java

Class BufferedImage does not implement the Cloneable interface. Thus the clone method is not overriden. Here's an alternative for a deep copy technique: Java Tip 76: An alternative to the deep copy technique

Solution 7 - Java

The following solution using arraycopy is about 3-4 times faster than the accepted answer:

public static BufferedImage copyImage(BufferedImage source){
    BufferedImage bi = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
    byte[] sourceData = ((DataBufferByte)source.getRaster().getDataBuffer()).getData();
    byte[] biData = ((DataBufferByte)bi.getRaster().getDataBuffer()).getData();
    System.arraycopy(sourceData, 0, biData, 0, sourceData.length);
    return bi;
}

By the way, the answers using Graphics2D provide similarly good results.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionf1wadeView Question on Stackoverflow
Solution 1 - JavaKlarkView Answer on Stackoverflow
Solution 2 - JavaAPersonView Answer on Stackoverflow
Solution 3 - Javauser1050755View Answer on Stackoverflow
Solution 4 - Javahyper-neutrinoView Answer on Stackoverflow
Solution 5 - JavaPixelMasterView Answer on Stackoverflow
Solution 6 - JavaMikeView Answer on Stackoverflow
Solution 7 - JavaclicView Answer on Stackoverflow