更快速地旋转90度或倍数的图像

时间:2016-11-13 21:30:22

标签: java image image-processing parallel-processing rotation

我想从文件夹中读取图像并将其旋转回来。 哪个是更快方式(不是更容易)旋转90度或 90度(90,180,270)的倍数的图像,而只是在Java 8中?

我在互联网上搜索了很多时间来找到这个问题的答案......但没有。所以我想到你们,也许你们其中一个人可以帮助我。我真的会认出那个人。

非常感谢。

1 个答案:

答案 0 :(得分:1)

正如@sascha所说:“你只是得到了一个不同的像素索引访问行为,这些行为受限于这些漂亮的轮换候选者”。

因此,您可以使用图像处理框架来访问像素并以这种方式转换图像。

就我而言,我使用了Marvin Framework。在我的笔记本上,500x298图像的旋转过程需要12毫秒。

<强> auto.jpg:
enter image description here

<强> auto_90.jpg:
enter image description here

<强> auto_180.jpg:
enter image description here

<强> auto_270.jpg:
enter image description here

源代码:

public class RotateImages {

    public RotateImages(){
        MarvinImage image = MarvinImageIO.loadImage("./res/auto.jpg");
        MarvinImageIO.saveImage(rotate90(image), "./res/auto_90.jpg");
        MarvinImageIO.saveImage(rotate180(image), "./res/auto_180.jpg");
        MarvinImageIO.saveImage(rotate270(image), "./res/auto_270.jpg");
    }

    private MarvinImage rotate90(MarvinImage image){
        MarvinImage imageOut = new MarvinImage(image.getHeight(), image.getWidth());
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                int newX = y;
                int newY = (image.getWidth()-1)-x;
                imageOut.setIntColor(newX, newY, image.getIntColor(x, y));
            }
        }
        return imageOut;
    }

    private MarvinImage rotate180(MarvinImage image){
        MarvinImage imageOut = new MarvinImage(image.getWidth(), image.getHeight());
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                int newX = (image.getWidth()-1)-x;
                int newY = (image.getHeight()-1)-y;
                imageOut.setIntColor(newX, newY, image.getIntColor(x, y));
            }
        }
        return imageOut;
    }

    private MarvinImage rotate270(MarvinImage image){
        MarvinImage imageOut = new MarvinImage(image.getHeight(), image.getWidth());
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                int newX = (image.getHeight()-1)-y;
                int newY = x;
                imageOut.setIntColor(newX, newY, image.getIntColor(x, y));
            }
        }
        return imageOut;
    }

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