1

我試圖編寫一個類在x和y方向上縫合雕刻圖像。 x方向正在工作,爲了減少y方向,我想簡單地將圖像旋轉90°,並在已重新縮放的圖像上(僅在x方向)上運行相同的代碼,然後將其旋轉回初始狀態。Rotating BufferedImage改變它的顏色

我找到了AffineTransform的東西,並試了一下。它實際上產生了一個旋轉的圖像,但搞亂了顏色,我不知道爲什麼。

這是所有代碼:

import java.awt.image.BufferedImage; 
import java.awt.geom.AffineTransform; 
import java.awt.image.AffineTransformOp; 
import java.io.File; 
import java.io.IOException; 
import javafx.scene.paint.Color; 
import javax.imageio.ImageIO; 


public class example { 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 
    // TODO code application logic here 

    BufferedImage imgIn = ImageIO.read(new File("landscape.jpg")); 
    BufferedImage imgIn2 = imgIn; 

    AffineTransform tx = new AffineTransform(); 
    tx.rotate(Math.PI/2, imgIn2.getWidth()/2, imgIn2.getHeight()/2);//(radian,arbit_X,arbit_Y) 

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 
    BufferedImage last = op.filter(imgIn2, null);//(sourse,destination) 
    ImageIO.write(last, "JPEG", new File("distortedColors.jpg")); 
} 

}

只是改變
BufferedImage imgIn = ImageIO.read(new File("landscape.jpg"));文件名和嘗試。

執行時,會得到4個圖像:熱圖,帶有接縫的圖像和重新縮放的圖像。最後一個圖像是一個測試,看看旋轉是否工作,它應該顯示旋轉的圖像,但扭曲的顏色...

幫助將不勝感激!

編輯:

enter image description here

+0

你調試,以確保你沒有錯誤的數據寫入到最終圖像?你確定使用相同的顏色設置(色彩空間等)?另外請發佈[mvce](http://stackoverflow.com/help/mcve),這是太多的代碼IMO。 – Thomas

+0

它是如何搞亂顏色的?它變得模糊或像所有的綠色都變成了粉紅色等顏色?也許你可以展示你的圖片。 –

+0

當然,讓我編輯它非常快! – ViktorG

回答

2

好像有一個顏色轉換,由於傳遞nullop.filter(imgIn2, null);發生。

如果你改變它像它應該工作:

BufferedImage last = new BufferedImage(imgIn2.getWidth(), imgIn2.getHeight(), imgIn2.getType()); 
op.filter(imgIn2, last); 
+0

工程,將重新閱讀AffineTransformOP的文檔以查找我的錯誤。謝謝 – ViktorG

2

的問題是與AffineTransformOp你需要:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR 

,而不是你現在有雙線性。

文檔第二段提示了這一點。

此類使用仿射變換從 的線性映射的二維座標的源圖像或Raster到2D中座標 目標圖像或Raster英寸使用的插值類型是 ,通過構造函數指定,可以由RenderingHints對象或 通過此類中定義的整數插值類型之一來指定。如果在構造函數中指定了 RenderingHints對象,則將使用 插值提示和渲染質量提示來設置此操作的插值類型 。

當需要顏色轉換時,可以使用抖色提示和 。注意 必須滿足以下約束條件:源和目標地址必須不同。對於柵格對象,源中帶 的數量必須等於目標中帶的數量。

所以此工程

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);