2011-02-07 15 views
17

मुझे प्रदर्शित करने के लिए BufferedImage घुमाने में परेशानी हो रही है। मुझे लगता है कि रोटेशन ठीक काम कर रहा है, लेकिन मैं वास्तव में इसे स्क्रीन पर नहीं खींच सकता। मेरे कोड:घुमावदार BufferedImage उदाहरण

Class extends JPanel { 
    BufferedImage img; 
    int rotation = 0; 

    public void paintComponent(Graphics g) { 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     img2d = img.createGraphics(); 
     img2d.rotate(Math.toRadians(rotation), img.getWidth()/2, img.getHeight()/2); 
     g.drawImage(img, imgx, imgy, null); 
     this.repaint(); 
    } 
} 

यह मेरे लिए काम नहीं कर रहा। मुझे घुमाए गए img2d को g पर घुमाने के लिए कोई रास्ता नहीं मिला।

संपादित करें: मेरे पास कई ऑब्जेक्ट हैं जिन्हें g पर खींचा जा रहा है, इसलिए मैं इसे घुमा नहीं सकता। मुझे व्यक्तिगत रूप से चीजों को घुमाने में सक्षम होना चाहिए।

उत्तर

18

मैं Graphics2D.drawImage(image, affinetranform, imageobserver) का उपयोग करूंगा।

नीचे दिया गया कोड उदाहरण एक छवि को घटक के केंद्र में घुमाता है और अनुवाद करता है।

screenshot

public static void main(String[] args) throws IOException { 
    JFrame frame = new JFrame("Test"); 

    frame.add(new JComponent() { 

     BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); 

     @Override 
     protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 

       // create the transform, note that the transformations happen 
       // in reversed order (so check them backwards) 
       AffineTransform at = new AffineTransform(); 

       // 4. translate it to the center of the component 
       at.translate(getWidth()/2, getHeight()/2); 

       // 3. do the actual rotation 
       at.rotate(Math.PI/4); 

       // 2. just a scale because this image is big 
       at.scale(0.5, 0.5); 

       // 1. translate the object so that you rotate it around the 
       // center (easier :)) 
       at.translate(-image.getWidth()/2, -image.getHeight()/2); 

       // draw the image 
       Graphics2D g2d = (Graphics2D) g; 
       g2d.drawImage(image, at, null); 

       // continue drawing other stuff (non-transformed) 
       //... 

     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 400); 
    frame.setVisible(true); 
} 
+0

@Squareoot कितना रोशनी है। –

32

शायद तुम AffineTransform इस तरह का उपयोग कर प्रयास करना चाहिए:

AffineTransform transform = new AffineTransform(); 
    transform.rotate(radians, bufferedImage.getWidth()/2, bufferedImage.getHeight()/2); 
    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); 
    bufferedImage = op.filter(bufferedImage, null); 

आशा इस मदद करता है।

4

आप अपनी छवि में चित्रित करने के लिए ग्राफिक्स को घुमा रहे हैं, छवि नहीं। Thats क्यों आप कोई प्रभाव नहीं देखते हैं। ग्राफिक्स आप पर चित्रकारी कर रहे हैं करने के लिए रोटेशन लागू करें और यह छवि घुमाया आकर्षित करेगा:

public void paintComponent(Graphics g) { 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.rotate(Math.toRadians(rotation), img.getWidth()/2, img.getHeight()/2); 
    g.drawImage(img, imgx, imgy, null); 
    this.repaint(); 
} 

यह शायद पूरी तरह से आप क्या उम्मीद नहीं दे पाएंगे, रोटेशन समन्वय मूल के चारों ओर घूमना होगा। छवि अपने केंद्र के चारों ओर घुमाने होने के लिए आप उदाहरण के लिए, रोटेशन से पहले एक समन्वय अनुवाद लागू करने की आवश्यकता:

g.translate(imgx >> 1, imgy >> 1); 

Graphics2D Tutorial कुछ और उदाहरण है।

+0

मैं अलग से BufferedImage बारी बारी से और फिर ग्राफिक्स के साथ आकर्षित करने के लिए करना चाहते हैं: इस परिणाम का एक स्क्रीनशॉट है। मेरे पास ग्राफिक्स ऑब्जेक्ट पर अन्य चीजें हैं जिन्हें घुमाया नहीं जाना चाहिए। –

+0

छवि खींचने के बाद आप ग्राफिक्स के परिवर्तन को पूर्ववत कर सकते हैं। – Durandal

+2

@Durandal क्या आप निश्चित हैं कि 'ग्राफिक्स' में घूर्णन विधि है? या आपका मतलब है 'g2d.rotate() '? – user3437460