我试图顺时针和逆时针旋转图像。在Sri Harsha Chilakapati this answer的帮助下,我设法根据自己的需要开展工作。这是代码
String rotateURL = tmp_dir + "/" + strusername + "rotate.jpg";
File fileJPG = new File(tmp_dir + "/" + strusername + "FullSize.jpg");
fullImage = ImageIO.read(fileJPG);
leftImage = rotateLeft(fullImage, 90);
writeImageToFile(leftImage, "jpg", new File(rotateURL));
public static BufferedImage rotateLeft(BufferedImage img, double angle)
{
double sin = Math.abs(Math.sin(Math.toRadians(angle))),
cos = Math.abs(Math.cos(Math.toRadians(angle)));
int w = img.getWidth(null), h = img.getHeight(null);
int neww = (int) Math.floor(w*cos + h*sin),
newh = (int) Math.floor(h*cos + w*sin);
BufferedImage bimg = new BufferedImage(neww, newh, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bimg.createGraphics();
g.translate((neww-w)/2, (newh-h)/2);
g.rotate(Math.toRadians(angle), w/2, h/2);
g.drawRenderedImage(img, null);
g.dispose();
return bimg;
}
然而,我似乎有一个缓存(不确定这个)问题,我需要在Thread.sleep(9000);
行之上放置一个fullImage = ImageIO.read(fileJPG);
,否则我的图像元素将包含正确的维度但不会#39 ; t显示它旋转。由于一张图片超过1000字:
要清楚,这应该是这样的:
现在睡眠是一种解决方案,但老实说,我不想在旋转之前等待9秒(算上它,8不起作用)。此外,我不确定它在较慢的计算机上给出了什么,因为它可能需要更长的时间?
由于AffineTransform quadrantrotate
应该更高效(并且问题被标记为重复),我尝试following answer但问题仍然存在。代码:
AffineTransform at = new AffineTransform();
at.translate(100, 40);
at.quadrantRotate(1, img.getWidth() / 2, img.getHeight() / 2);
g.drawImage(img, at, null);
g.dispose();
仍然会出现同样的问题。我尝试了另一种阅读图像的方法
fullImage = Toolkit.getDefaultToolkit().getImage(new File(rotateURL).getAbsolutePath());
leftImage = rotatePicture(fullImage, 90);
但仍然存在问题。 因此,图像的阅读似乎存在问题,在阅读图像时我是否还有其他任何想法?