2011-08-31 18 views
7

यहां मेरे कोड "आकार बदलने छवि जावा getScaledInstance

ImageIcon ii=new ImageIcon("/Users/tushar_chutani/Desktop/apple.jpg"); 
      Image image= ii.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH); 

छवि बढ़ाया जा रहा है क्या कोड के साथ गलत क्या है?

+1

आपको क्या त्रुटियां मिल रही हैं? क्या आप वास्तव में मूल छवि आइकन प्रदर्शित कर सकते हैं? आप कैसे जानते हैं स्केलिंग नहीं है। आपके द्वारा पोस्ट किए गए कोड की दो पंक्तियों के आधार पर आप छवि के साथ कुछ भी नहीं करते हैं। अपना [एसएससीसीई] (http://sscce.org) पोस्ट करें जो समस्या का प्रदर्शन करता है। – camickr

+0

छवि प्रदर्शित नहीं हो रही है ... छवि सफेद में बदलती है ... –

+1

फिर शायद यह छवि नहीं पढ़ी। आपने एसएससीसीई पोस्ट नहीं किया है, इसलिए हम आपके लिए और कुछ नहीं कर सकते हैं। – camickr

उत्तर

15

समस्या यह है कि Image.getScaledInstance() एक समाप्त होने पर, आकार बदली गई चित्र वापस नहीं करता है । यह एक बाद में समय के लिए स्केलिंग काम की बहुत छोड़ देता है जब छवि पिक्सल किया जाता है।

उदाहरण के लिए, तो आप एक Graphics2D.drawImage() कॉल में स्केल की छवि का उपयोग करता है, तो विधि झूठी वापसी होगी और असीमित रूप से ड्राइंग जारी रखेगी। आपको स्केलिंग और ड्राइंग के पूरा होने की प्रतीक्षा करने के लिए Graphics2D.drawImage() कॉल में ImageObserver पैरामीटर का उपयोग करना होगा।

निम्नलिखित उदाहरण दिखाता है कि छवियों को ImageObserver के बिना कैसे स्केल करें। स्केलिंग आइकन को BufferedImage में चित्रित करके किया जाता है।

import javax.swing.ImageIcon; 
import java.awt.image.BufferedImage; 
import java.awt.Image; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.io.File; 
import javax.imageio.ImageIO; 
import java.awt.RenderingHints; 

public class Tushar2 
{ 
     public void scaleImage() 
     { 
       try 
       { 
         ImageIcon ii = new ImageIcon("/tmp/apple.jpg"); 
         BufferedImage bi = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB); 
         Graphics2D g2d = (Graphics2D)bi.createGraphics(); 
         g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, 
           RenderingHints.VALUE_RENDER_QUALITY)); 
         boolean b = g2d.drawImage(ii.getImage(), 0, 0, 50, 50, null); 
         System.out.println(b); 
         ImageIO.write(bi, "jpg", new File("/tmp/apple50.jpg")); 
       } 
       catch (Exception e) 
       { 
         e.printStackTrace(); 
       } 
     } 

     public static void main(String []args) 
     { 
       new Tushar2().scaleImage(); 
     } 
} 
2

आप छवि को फिर से छवि आइकन में लपेट सकते हैं। एक छवि आइकन आमतौर पर छवि को अपने कन्स्ट्रक्टर में लोड कर रहा है और इस उद्देश्य के लिए अपने मीडिया ट्रैकर का उपयोग करता है। मैं निम्नलिखित कोड का उपयोग कर रहा अब:

 Image image = icon.getImage().getScaledInstance(
      icon.getIconWidth() * NEW/OLD, 
      icon.getIconHeight() * NEW/OLD, 
      Image.SCALE_SMOOTH); 
    icon = new ImageIcon(image, icon.getDescription()); 

आप सीधे नए आइकन के साथ काम कर सकते हैं या getImage फोन() नई छवि के साथ काम करने के लिए। उपर्युक्त कोड कुछ नई और पुरानी जोड़ी पर दिए गए स्केलिंग को संरक्षित करने वाला एक पहलू अनुपात भी करता है।

अलविदा

संबंधित मुद्दे