2010-11-11 16 views
7

में एक छवि घुमाएं मैं एक छवि को घुमाएगा। मेरे पास JInternalFrame है जिसमें JLabel है। लेबल में छवि है। छवि घूर्णन करने के बाद, मुझे आंतरिक फ्रेम का आकार बदलना होगा। कोड जो मैंने वर्तमान में छवि को घुमाया है, लेकिन छवि के किनारों के चारों ओर काला है और यह केंद्रित है। इसे ठीक करने के लिए कोई सुझाव?जावा

public void rotateIcon(int angle) 
{ 
     int w = theLabel.getIcon().getIconWidth(); 
     int h = theLabel.getIcon().getIconHeight(); 
     int type = BufferedImage.TYPE_INT_RGB; // other options, see api 

     BufferedImage DaImage = new BufferedImage(h, w, type); 
     Graphics2D g2 = DaImage.createGraphics(); 

     double x = (h - w)/2.0; 
     double y = (w - h)/2.0; 
     AffineTransform at = AffineTransform.getTranslateInstance(x, y); 

     at.rotate(Math.toRadians(angle), w/2.0, h/2.0); 
     g2.drawImage(new ImageIcon(getData()).getImage(), at, theLabel); 
     g2.dispose(); 

     theLabel.setIcon(new ImageIcon(DaImage)); 
     this.setSize(DaImage.getWidth(),DaImage.getHeight()); //resize the frame 
} 
+0

से सामान्य तौर पर, एक छवि घूर्णन चौड़ाई और ऊंचाई (एक्स और वाई अक्ष के सापेक्ष) बदल जाता है। मुझे लगता है कि यह "केंद्रित बंद" होने में योगदान दे रहा है। मुझे इसे नए आकार और इसके लिए लेखांकन की गणना करके हल करना पड़ा है। काले किनारों के लिए, यह एक बहुत ही आम मामला है जहां घूर्णन कार्य अल्फा चैनल के साथ काम नहीं कर रहा है। हो सकता है कि यह स्थिति के लिए मदद करेगा: http://stackoverflow.com/questions/2056338/calculating-the-center-of-rotation-after-translation – Jere

+1

यह भी देखें http://stackoverflow.com/questions/3420651 – trashgod

उत्तर

15

आपको काला क्षेत्र को रोकने के लिए पारदर्शिता का उपयोग करके सही चौड़ाई/ऊंचाई निर्धारित करने के लिए त्रिकोणमिति का उपयोग करने की आवश्यकता है, और मुझे लगता है कि ट्रांसफॉर्म गलत है, जो इसे केंद्र से बाहर कर रहा है।

इस प्रयास करें:

public static BufferedImage rotate(BufferedImage image, double angle) { 
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle)); 
    int w = image.getWidth(), h = image.getHeight(); 
    int neww = (int)Math.floor(w*cos+h*sin), newh = (int) Math.floor(h * cos + w * sin); 
    GraphicsConfiguration gc = getDefaultConfiguration(); 
    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT); 
    Graphics2D g = result.createGraphics(); 
    g.translate((neww - w)/2, (newh - h)/2); 
    g.rotate(angle, w/2, h/2); 
    g.drawRenderedImage(image, null); 
    g.dispose(); 
    return result; 
} 

private static GraphicsConfiguration getDefaultConfiguration() { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice gd = ge.getDefaultScreenDevice(); 
    return gd.getDefaultConfiguration(); 
} 

http://flyingdogz.wordpress.com/2008/02/11/image-rotate-in-java-2-easier-to-use/

+0

यह वास्तव में अच्छा है। हालांकि मुझे इसके साथ एक मुद्दा है। मेरी छवि केवल 90 डिग्री घुमाने की जरूरत है। समय पर। अगर मैं कोण के लिए 90 में गुजरता हूं, तो यह वास्तव में 90 डिग्री से अधिक – user489041

+1

घुमाएगा यह रेडियंस का उपयोग कर रहा है, इसलिए बस Math.toRadians (डिग्री) का उपयोग करें। –

+0

एक आकर्षण की तरह काम किया। धन्यवाद! – user489041

4

आप Rotated Icon का उपयोग करने का प्रयास कर सकते हैं।

BufferedImage DaImage = new BufferedImage(height, width, type);

लिए:

BufferedImage DaImage = new BufferedImage(**width, height**, type);

+0

धन्यवाद, मुझे इसमें देखना होगा। – user489041

0

अगर आप को बदलने में मदद करता है?

+0

हाँ, मैंने उन लोगों को आगे और पीछे स्विच किया, फिर भी कोई सफलता नहीं। – user489041