짧은 답변 : 예, 당신은 버퍼 이미지 에 생성 된
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 VM에서 작동하지 않을 수 있습니다. 최소한 접근 방식을 보여 주므로 필드를 가져 오기 위해 실제 클래스를 검사해야 할 수도 있습니다.
이 서브 이미지는() 기본 복사하지 않는다는 것을 알고 있어야합니다 적어도 BufferedImage로 이미지 데이터 따라서 subImage()에서 얻은 Image를 그리면 원본을 수정하고 target.createGraphics(). drawImage (Image img, ...)를 사용하면 실제로 사본을 만듭니다. – Trilarion