लघु जवाब: हां, आप
एक 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();
}
}
नोट: इस कुछ सूर्य/Oracle वर्गों पर निर्भर करता है और सभी जावा VMs के साथ काम नहीं कर सकते हैं। कम से कम यह एक दृष्टिकोण दिखाता है और आपको फ़ील्ड प्राप्त करने के लिए वास्तविक कक्षाओं का निरीक्षण करना पड़ सकता है।
स्रोत
2010-12-06 15:04:44
पता है कि subimage() अंतर्निहित नकल नहीं करती है छवि डेटा, कम से कम BufferedImage के साथ। तो यदि आप subImage() द्वारा प्राप्त छवि पर आकर्षित करते हैं तो आप target.createGraphics() के साथ मूल को भी संशोधित करते हैं। DrawImage (छवि img, ...) वास्तव में आप वास्तव में एक प्रति बनाते हैं। – Trilarion