Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—在参数后调整大小、旋转和绘制图像的方法_Java_Image_Rotation_Resize_Draw - Fatal编程技术网

Java—在参数后调整大小、旋转和绘制图像的方法

Java—在参数后调整大小、旋转和绘制图像的方法,java,image,rotation,resize,draw,Java,Image,Rotation,Resize,Draw,我试图用java制作一个方法,在给定参数后调整旋转大小并绘制图像。 这不管用。Idk如何?顺便问一下,是否可以使用普通的Graphic类而不是Graphic2D来执行此操作?谢谢 public void drawResizedAndRotatedImage(Image image, Graphics g, int x, int y, int sizeX, int sizeY, double degrees){ //Resize BufferedImage

我试图用java制作一个方法,在给定参数后调整旋转大小并绘制图像。 这不管用。Idk如何?顺便问一下,是否可以使用普通的Graphic类而不是Graphic2D来执行此操作?谢谢

    public void drawResizedAndRotatedImage(Image image, Graphics g, int x, int y, int sizeX, int sizeY, double degrees){
        //Resize
        BufferedImage im = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_4BYTE_ABGR);
        @SuppressWarnings("unused")
        Graphics g2 = (Graphics)im.getGraphics();

        //Rotate
        ImageIcon imageIcon = new ImageIcon(image);
        BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        Graphics2D g2d = (Graphics2D)bufferedImage.getGraphics();
        g2d.rotate(Math.toRadians(degrees), imageIcon.getIconWidth() / 2, imageIcon.getIconHeight() / 2);

        //Draw
        g.drawImage(image, x, y, sizeX, sizeY, null);
    }
好的,那么你创建一个BuffereImage并获取它的图形上下文

BufferedImage im = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g2 = (Graphics)im.getGraphics();
g.drawImage(image, x, y, sizeX, sizeY, null);
什么都不要做

然后创建第二个BuffereImage,获取它的图形上下文,设置它的旋转上下文,然后不为其绘制任何内容

BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = (Graphics2D)bufferedImage.getGraphics();
g2d.rotate(Math.toRadians(degrees), imageIcon.getIconWidth() / 2, imageIcon.getIconHeight() / 2);
然后将原始图像绘制到提供的图形上下文中

BufferedImage im = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g2 = (Graphics)im.getGraphics();
g.drawImage(image, x, y, sizeX, sizeY, null);
一事无成

我认为你需要从通读开始,以获得一些基础知识

转换是复合的,它们也只会影响应用后绘制到图形上下文中的任何内容

最简单的方法实际上是使用仿射变换

例如

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestImage {

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

    public TestImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage original;

        public TestPane() {
            try {
                original = ImageIO.read(new File("Your image here"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

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

        public Image scaleAndRotate(Image image, int sizeX, int sizeY, double degrees) {

            double scaleWidth = (double)sizeX / (double)image.getWidth(this);
            double scaleHeight = (double)sizeY / (double)image.getHeight(this);
            BufferedImage img = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = img.createGraphics();
            AffineTransform at = new AffineTransform();
            at.scale(scaleWidth, scaleHeight);
            at.rotate(Math.toRadians(degrees), image.getWidth(this) / 2d, image.getHeight(this) / 2d);
            g2d.setTransform(at);
            g2d.drawImage(image, sizeX / 2, sizeY / 2, null);
            g2d.dispose();

            return img;

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            int scaleWidth = getWidth() / 2;
            int scaleHeight = getHeight() / 2;

            Image img = scaleAndRotate(original, scaleWidth, scaleHeight, 45.0);
            int x = (getWidth() - img.getWidth(this)) / 2;
            int y = (getHeight()- img.getHeight(this)) / 2;

            g2d.drawImage(img, x, y, this);
            g2d.dispose();
        }

    }

}
你也可以通读一下

有关缩放算法和技术的讨论


您还应该知道,图像旋转时的大小也会发生变化,请查看我最喜欢的答案之一,以了解有关如何计算旋转图像的结果图像大小的更多详细信息…

是否可以使用普通图形类而不是Graphic2D进行此操作?-看一看,告诉我们我已经看了,但是我什么也找不到。看起来你找到了这个问题的答案…@Oliver我很抱歉你这么想,但我不是在你身上扔一堵代码墙,期望你知道它是如何工作的,我觉得指出代码不起作用的原因并提供解决方案非常重要,这样您就可以看到它们工作方式的不同。我还认为,为您提供帮助自己的工具是一个好主意,这样您就可以进一步了解解决方案并自行解决问题。出于某种原因,这是可行的。g、 drawOval和诸如此类的工作,但不是这个。。。。有线。但我想我会继续旋转画作中的图像。谢谢我还试着复制你的类并运行它。有个错误。wieredYou应该得到一个错误,你需要提供一个失败的形象,它说,你的形象在这里;