Краткий ответ: Да, вы можете
Объект Graphics2D, который был создан на буферизованном изображении знает изображение, но не хочет возвращать его вам. Если вы не возражаете против использования отражения, вы можете украсть его обратно (отражение). Следующий код демонстрирует подход:
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();
}
}
Примечание: это зависит от некоторых классов Sun / Oracle и может работать не со всеми виртуальными машинами Java. По крайней мере, это показывает подход, и вам, возможно, придется проверить фактические классы, чтобы получить поля.