旋转BufferedImage的问题

时间:2015-11-09 13:28:51

标签: java rotation vaadin

我试图顺时针和逆时针旋转图像。在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字:

right dimensions, wrong rotation

要清楚,这应该是这样的:

right dimensions, right rotation

现在睡眠是一种解决方案,但老实说,我不想在旋转之前等待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);

但仍然存在问题。 因此,图像的阅读似乎存在问题,在阅读图像时我是否还有其他任何想法?

0 个答案:

没有答案