2012-01-14 13 views
6

Tengo una imagen. Necesito hacer una copia exacta y guardarlo en BufferedImage, pero no hay Image.clone(). La cosa debería estar dentro de un ciclo de cálculo y, por lo tanto, debería ser realmente rápido, sin copia de píxel por píxel. ¿Cuál es el mejor método de rendimiento para hacer esto?Cómo clonar imagen?

+1

Eche un vistazo a esta http://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage – user219882

+1

Copia la imagen por píxel -pixel (solo copia los datos de la trama). ¿Hay alguna forma de hacerlo más rápido? – Cenius

+0

Si quiere una copia profunda, no hay otra forma que conozca. ¿Y por qué quieres clonar cada iteración de bucle? – user219882

Respuesta

7

Puede dibujar en una imagen almacenada en el búfer, por lo que debe crear una imagen en memoria intermedia, crear un contexto de gráficos a partir de ella y dibujar su imagen original.

BufferedImage copyOfImage = 
    new BufferedImage(widthOfImage, heightOfImage, BufferedImage.TYPE_INT_RGB); 
Graphics g = copyOfImage.createGraphics(); 
g.drawImage(originalImage, 0, 0, null); 
+1

Eso perdería transparencia. Si tiene dudas, use 'TYPE_INT_ARGB'. –

+0

Hm ... Esto se ve más rápido para mí. – Cenius

+0

¡Recuerde siempre 'disponer()' el objeto 'Gráficos' después de su uso! – haraldK

0

Hay otra manera:

BufferedImage copyOfImage = image.getSubimage(0, 0, image.getWidth, image.getHeight); 
+2

No, esto no funcionará, ya que 'copyOfImage' y' image' compartirán los búferes de respaldo (será una copia superficial). Las ediciones hechas en una, se reflejarán en la otra. – haraldK

0

Image clone = original.getScaledInstance(original.getWidth(), -1, Image.SCALE_DEFAULT);

Esto podría no ser muy bonito, pero getScaledInstance retornos, como su nombre indica, una instancia de su Image objeto original. Usualmente solo se usa para cambiar el tamaño. -1 le dice al método que mantenga la relación de aspecto tal como está

+1

¿Podría por favor [editar] su respuesta para dar una explicación de por qué este código responde la pregunta? Las respuestas de solo código son [desaconsejadas] (http://meta.stackexchange.com/questions/148272) porque no enseñan la solución. – DavidPostill