Respuesta corta: Sí, se puede
Un objeto Graphics2D que se ha creado en una imagen tamponada sabe la imagen, pero no está dispuesto a entregar de nuevo a usted. Si no te importa usar el reflejo, puedes robar atrás (reflejo). El código siguiente muestra el enfoque:
public class Graphics2DReflector {
public static void main(String[] args) {
// prepare the Graphics2D - note, we don't keep a ref to the image!
final Graphics2D g2d =
new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB).createGraphics();
g2d.drawString("Reflected", 10, 50);
JFrame frame = new JFrame("Reflected Image");
// one Panel to show the image only known by g2d
frame.getContentPane().add(new Panel() {
@Overwrite
public void paint(Graphics g) {
try {
SurfaceData data = ((SunGraphics2D) g2d).surfaceData;
Field bufImg = BufImgSurfaceData.class.getDeclaredField("bufImg");
bufImg.setAccessible(true);
BufferedImage image = (BufferedImage) bufImg.get(data);
g.drawImage(image,0,0,null);
} catch (Exception oops) {
oops.printStackTrace();
}
}
});
frame.setSize(200,200);
frame.setVisible();
}
}
Nota: esto depende de algunas clases de Sun/Oracle y podría no funcionar con todas las máquinas virtuales de Java. Al menos muestra un enfoque y es posible que deba inspeccionar las clases reales para obtener los campos.
Tenga en cuenta que la sub-imagen() no copia el subyacente datos de imagen, al menos con BufferedImage. Entonces, si dibujas sobre la Imagen obtenida por subimagen() también modificas el original, mientras que con target.createGraphics(). DrawImage (Img de Imagen, ...) realmente haces una copia. – Trilarion