2016-11-13 70 views
1

我想從文件夾中讀取圖像並將其寫回旋轉。 這是更快方式(而不是更容易的)旋轉圖像90度或90度(90,180,270)和只是它在Java 8的倍數以90度或倍數旋轉圖像的更快方法

我在互聯網上搜索了很多時間來找到這個問題的答案......但沒有。所以我在想你們,也許你們中的一個人幫我解決了這個問題。我會真正認識到那個人。

非常感謝。

+0

你有沒有聽說過的仿射變換的? –

+0

是的,我聽說過這個,我已經做了一些測試。但我不確定這是否是更快的方法...... – cavaler12345

+0

該旋轉的計算甚至不是I/O和可能壓縮所需時間的0.001%。 (實際上並不是真正的計算,你只是獲得了像素索引的不同訪問行爲,這些行爲約束於這些* nice *旋轉候選:90°切換行和列; 180°反轉模式循環) – sascha

回答

0

正如@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

一個uto_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(); } 
}