用Java旋转缓冲的图像

我试图在java中旋转缓冲的图像。 这是我正在使用的代码:

public static BufferedImage rotate(BufferedImage bimg, double angle){ int w = bimg.getWidth(); int h = bimg.getHeight(); Graphics2D graphic = bimg.createGraphics(); graphic.rotate(Math.toRadians(angle), w/2, h/2); graphic.drawImage(bimg, null, 0, 0); graphic.dispose(); return bimg; } 

我已经看了很多关于这个主题的堆栈溢出问题和答案,并且无法弄清楚为什么图像在我尝试旋转时被切碎。 这是一个显示加载图像的示例: 加载图像

单击旋转按钮后,使用缓冲图像调用上述function,角度为90.0: 切断图像

有人可以帮助我了解正在发生的事情以及如何解决这个问题吗?

谢谢!

一如既往,上网救援。 所以,这是我从其他资源/post/博客一起蹒跚而行的一些代码,这些代码将返回一个大小的新图像,以便它包含旋转的图像

 public BufferedImage rotateImageByDegrees(BufferedImage img, double angle) { double rads = Math.toRadians(angle); double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads)); int w = img.getWidth(); int h = img.getHeight(); int newWidth = (int) Math.floor(w * cos + h * sin); int newHeight = (int) Math.floor(h * cos + w * sin); BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotated.createGraphics(); AffineTransform at = new AffineTransform(); at.translate((newWidth - w) / 2, (newHeight - h) / 2); int x = w / 2; int y = h / 2; at.rotate(rads, x, y); g2d.setTransform(at); g2d.drawImage(img, 0, 0, this); g2d.setColor(Color.RED); g2d.drawRect(0, 0, newWidth - 1, newHeight - 1); g2d.dispose(); return rotated; } 

更新

所以,使用这个PNG:

图片

这段代码……

 package javaapplication1.pkg040; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { 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 master; private BufferedImage rotated; public TestPane() { try { master = ImageIO.read(new File("/Volumes/Disk02/Dropbox/MegaTokyo/Miho_Small.png")); rotated = rotateImageByDegrees(master, 0.0); } catch (IOException ex) { ex.printStackTrace(); } Timer timer = new Timer(40, new ActionListener() { private double angle = 0; private double delta = 1.0; @Override public void actionPerformed(ActionEvent e) { angle += delta; rotated = rotateImageByDegrees(master, angle); repaint(); } }); timer.start(); } @Override public Dimension getPreferredSize() { return master == null ? new Dimension(200, 200) : new Dimension(master.getWidth(), master.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (rotated != null) { Graphics2D g2d = (Graphics2D) g.create(); int x = (getWidth() - rotated.getWidth()) / 2; int y = (getHeight() - rotated.getHeight()) / 2; g2d.drawImage(rotated, x, y, this); g2d.dispose(); } } public BufferedImage rotateImageByDegrees(BufferedImage img, double angle) { double rads = Math.toRadians(angle); double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads)); int w = img.getWidth(); int h = img.getHeight(); int newWidth = (int) Math.floor(w * cos + h * sin); int newHeight = (int) Math.floor(h * cos + w * sin); BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotated.createGraphics(); AffineTransform at = new AffineTransform(); at.translate((newWidth - w) / 2, (newHeight - h) / 2); int x = w / 2; int y = h / 2; at.rotate(rads, x, y); g2d.setTransform(at); g2d.drawImage(img, 0, 0, this); g2d.dispose(); return rotated; } } } 

我可以生成像……

旋转

您必须考虑resize以及输出的新宽度和高度。 请参阅: https : //stackoverflow.com/a/4787898/5420880