Java—在参数后调整大小、旋转和绘制图像的方法
我试图用java制作一个方法,在给定参数后调整旋转大小并绘制图像。 这不管用。Idk如何?顺便问一下,是否可以使用普通的Graphic类而不是Graphic2D来执行此操作?谢谢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
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应该得到一个错误,你需要提供一个失败的形象,它说,你的形象在这里;