簡體   English   中英

Java:圍繞其中心旋轉圖像

[英]Java: Rotating image around its center

我是 Java 編程的新手,我正在嘗試使用以下代碼旋轉圖像,但似乎沒有任何效果,我在網上搜索了很多但沒有任何幫助。 我看到人們使用 BufferedImage 這樣做,但不想使用它。 此代碼正在旋轉整個 2d 對象,而不僅僅是我想要旋轉的圖像。 我通過顯示矩形發現了這一點,因為圖像沒有彼此對齊。 謝謝你的幫助。


package package3;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Rotate extends JPanel {

    public static void main(String[] args) {
        new Rotate().go();
    }
    
    public void go() {
        JFrame frame = new JFrame("Rotate");
        JButton b = new JButton("click");
        
        MyDrawPanel p = new MyDrawPanel();
        frame.add(p);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 1000);
        frame.setVisible(true);
    }
    

    class MyDrawPanel extends JPanel{
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g; 
            Image image = new ImageIcon(
                             getClass()
                            .getResource("wheel.png"))
                            .getImage();
            g2d.drawImage(image, 0, 0, 500, 500, this);
            
            int x = image.getHeight(this);
            int y = image.getWidth(this);
            g2d.rotate(1, x/2, y/2);
            g2d.setBackground(Color.black);
            g2d.drawImage(image, 0, 0, 500, 500, this); 
            g2d.setColor(Color.BLACK);
            g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
        }
    }
}

這是輸出的樣子

首先,當使用Graphics上下文旋轉圖像時,旋轉將發生在“錨點”(如果我記得的話,頂部/左側是默認位置)。

因此,為了圍繞它的中心旋轉圖像,您需要將錨點設置為圖像在其容器上下文中的中心。

這意味着rotate調用應該是這樣的......

g2d.rotate(radians, xOffset + (image.getWidth() / 2), yOffset + (image.getHeight() / 2));

然后當您在xOffset / yOffset繪制圖像時,圖像將“出現”圍繞錨點(或圖像的中心)旋轉。

其次,轉型正在復合。 也就是說,當您轉換圖形上下文時,所有后續的繪制操作都將被轉換。 如果你再次變換它,新的變換將被添加到舊的(所以如果你旋轉 45 度然后再次旋轉 45 度,變換現在是 90 度)。

首先create Graphics狀態的“副本”,應用您的轉換和繪畫操作,然后dispose副本通常是“最簡單的”,這將使原始上下文保持其原始(轉換后)狀態(應用所有繪畫操作),這樣你就不用花時間去弄清楚如何消除混亂

在此處輸入圖像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();

                    frame.add(new MyDrawPanel());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    class MyDrawPanel extends JPanel {

        private BufferedImage image;

        public MyDrawPanel() throws IOException {
            image = ImageIO.read(getClass().getResource("/images/MegaTokyo.png"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(1000, 1000);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (image == null) {
                return;
            }
            Graphics2D g2d = (Graphics2D) g.create();
            drawImageTopLeft(g2d);
            drawImageBottomRight(g2d);
            drawImageMiddle(g2d);

            g2d.rotate(Math.toRadians(45), getWidth() / 2, getHeight() / 2);
            g2d.setColor(Color.BLACK);
            g2d.drawRect(0, 0, this.getWidth(), this.getHeight());
            g2d.dispose();
        }

        protected void drawImageTopLeft(Graphics2D g2d) {
            g2d = (Graphics2D) g2d.create();
            int x = 0;
            int y = 0;

            g2d.rotate(Math.toRadians(135), image.getWidth() / 2, image.getHeight() / 2);
            g2d.drawImage(image, x, y, this);
            g2d.dispose();
        }

        protected void drawImageBottomRight(Graphics2D g2d) {
            g2d = (Graphics2D) g2d.create();
            int x = (getWidth() - image.getWidth());
            int y = (getHeight() - image.getHeight());

            g2d.rotate(Math.toRadians(-45), getWidth() - (image.getWidth() / 2), getHeight() - (image.getHeight() / 2));
            g2d.drawImage(image, x, y, this);
            g2d.dispose();
        }

        protected void drawImageMiddle(Graphics2D g2d) {
            g2d = (Graphics2D) g2d.create();
            int x = (getWidth() - image.getWidth()) / 2;
            int y = (getHeight() - image.getHeight()) / 2;

            g2d.rotate(Math.toRadians(45), getWidth() / 2, getHeight() / 2);
            g2d.drawImage(image, x, y, this);
            g2d.dispose();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM