2012-11-28 40 views
57

वहाँ पहले से ही StackOverflow पर इस link और स्वीकार किए जाते हैं जवाब की तरह सवाल BufferedImage के लिए छवि "कास्टिंग" है:जावा परिवर्तित

Image image = ImageIO.read(new File(file)); 
BufferedImage buffered = (BufferedImage) image; 

मेरे कार्यक्रम में मैं कोशिश:

final float FACTOR = 4f; 
BufferedImage img = ImageIO.read(new File("graphic.png")); 
int scaleX = (int) (img.getWidth() * FACTOR); 
int scaleY = (int) (img.getHeight() * FACTOR); 
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 
BufferedImage buffered = (BufferedImage) image; 

Unfortunatelly मैं चलाने मिल समय त्रुटि:

sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage

स्पष्ट रूप से कास्टिंग काम नहीं करता है।
प्रश्न यह है: छवि को BufferedImage में परिवर्तित करने का उचित तरीका क्या है (या है)?

+0

अगर आप बफ़र छवि को स्केल करना चाहते हैं, इस इस [http://stackoverflow.com/questions/4216123/ कोशिश की कोशिश कैसे करने के लिए पैमाने-ए-BufferedImage] [1] [1]: http://stackoverflow.com/questions/4216123/how-to-scale-a-buffere dimage – user902383

+6

रिकॉर्ड के लिए, यह संकलक नहीं है जो कह रहा है। आप वास्तव में रनटाइम त्रुटि देख रहे हैं ... संकलन त्रुटि नहीं। –

+1

आप सही हैं। इस पर ध्यान दिलाने के लिए धन्यवाद। मैं तदनुसार सवाल संपादित करूंगा। –

उत्तर

74

एक Java Game Engine से:

/** 
* Converts a given Image into a BufferedImage 
* 
* @param img The Image to be converted 
* @return The converted BufferedImage 
*/ 
public static BufferedImage toBufferedImage(Image img) 
{ 
    if (img instanceof BufferedImage) 
    { 
     return (BufferedImage) img; 
    } 

    // Create a buffered image with transparency 
    BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 

    // Draw the image on to the buffered image 
    Graphics2D bGr = bimage.createGraphics(); 
    bGr.drawImage(img, 0, 0, null); 
    bGr.dispose(); 

    // Return the buffered image 
    return bimage; 
} 
+0

क्या यह पूरी छवि स्मृति की प्रतिलिपि बनाना वास्तव में आवश्यक है? –

+0

@ TomášZato मुझे लगता है कि 'छवि' से' BufferedImage' में कनवर्ट करने का एकमात्र तरीका है। जावा का उपयोग करते समय आपको स्मृति के बारे में चिंता नहीं करना चाहिए। –

+4

@ श्रीहर चिलकापति 'जावा का उपयोग करते समय आपको स्मृति के बारे में चिंता नहीं करना चाहिए।' जावा अनुप्रयोगों द्वारा औसत स्मृति खपत से निर्णय लेना, अन्य डेवलपर्स निश्चित रूप से स्मृति के बारे में चिंता नहीं करते हैं। –

2

आप एक sun.awt.image.ToolkitImage वापस हो रही है, तो आप उस के लिए छवि डाल सकता है, और फिर getBufferedImage() का उपयोग BufferedImage मिलता है।

कोड के अपने अंतिम पंक्ति जहां कास्ट कर रहे हैं के बजाय आप बस करना होगा:

BufferedImage buffered = ((ToolkitImage) image).getBufferedImage(); 
+4

ओपनजेडीके – AvrDragon

+4

1 के लिए काम नहीं करता है 1) यह 'सूर्य' पैकेज से कक्षाओं का उपयोग करने के लिए तैयार है। उन्हें गैर-ओरेकल जेडीके में उपलब्ध होने की गारंटी नहीं है। 2) विधि 'getBufferedImage()' केवल तभी काम करता है जब buffered छवि को 'TookitImage' द्वारा आंतरिक रूप से जेनरेट किया गया हो। अक्सर (99%) यह नहीं है, इसलिए वापसी मूल्य 'शून्य 'है। [स्रोत संदर्भ] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/image/ToolkitImage.java#ToolkitImage.getBufferedImage%28%29) – kevinarpe

16

एक तरह से संभाल करने के लिए यह एक नया BufferedImage बनाने के लिए है, और बता यह है ग्राफिक्स अपने आकार बदली गई चित्र आकर्षित करने के लिए आपत्ति नए बुफर्ड इमेज में:

final float FACTOR = 4f; 
BufferedImage img = ImageIO.read(new File("graphic.png")); 
int scaleX = (int) (img.getWidth() * FACTOR); 
int scaleY = (int) (img.getHeight() * FACTOR); 
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 
BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE); 
buffered.getGraphics().drawImage(image, 0, 0 , null); 

इसे कास्टिंग किए बिना चाल करना चाहिए।

+1

कभी भी बनाए गए ग्राफिक्स उदाहरणों का निपटान करना न भूलें –

+0

"बनाए गए ग्राफिक्स इंटरफेस का निपटान कैसे करें"? – Buffalo

+2

आप एक buffered.getGraphics() जोड़ें। निपटान(); कोड के लिए। – salbeira

1

यदि आप कोटलिन का उपयोग करते हैं, तो आप छवि को एक विस्तार विधि जोड़ सकते हैं जैसे श्री हर्ष चिलकापति सुझाव देते हैं।

fun Image.toBufferedImage(): BufferedImage { 
    if (this is BufferedImage) { 
     return this 
    } 
    val bufferedImage = BufferedImage(this.getWidth(null), this.getHeight(null), BufferedImage.TYPE_INT_ARGB) 

    val graphics2D = bufferedImage.createGraphics() 
    graphics2D.drawImage(this, 0, 0, null) 
    graphics2D.dispose() 

    return bufferedImage 
} 

और इस तरह इसका इस्तेमाल:

myImage.toBufferedImage()