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つのイメージが表示されます。最後の画像は、回転がうまくいっているかどうかを確認するテストです。回転した画像が表示されますが、色は歪んでいます...

ヘルプは大歓迎です!

EDIT:

enter image description here

+0

に動作します、あなたはあなたがその最終的な画像に誤ったデータを書き込むいない作るためにデバッグましたか?同じ色の設定(色空間など)を使用していることを確認しましたか?また、[mvce](http://stackoverflow.com/help/mcve)を投稿してください、あまりにも多くのコードのIMOです。 – Thomas

+0

どのように色が乱れましたか?すべての緑色がピンク色になっているように、ぼやけたり色が変わったりしましたか?たぶんあなたのイメージを表示することができます。 –

+0

確かに、私はそれを本当に素早く編集させてください! – ViktorG

答えて

2

op.filter(imgIn2, null);nullを渡すことが原因起こって色変換がありますように思えます。あなたがそのようにそれを変更した場合は

それが動作するはずです:

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

作品、私のエラーを見つけるためにAffineTransformOPのドキュメントを読み返すつもりです。ありがとうございました – ViktorG

2

問題があるとAffineTransformOpあなたが必要です:代わりにあなたが今持っているBILINEARの

AffineTransformOp.TYPE_NEAREST_NEIGHBOR 

ドキュメントのヒントの第2段落がこれに向かっています。

このクラスは 2Dから線形マッピングを実行するためにアフィン変換を使用 宛先画像またはラスタ座標2Dに、ソース画像またはラスタ座標。使用される補間のタイプは、RenderingHintsオブジェクトまたはこのクラスで定義されている整数補間タイプのいずれかによる のいずれかによって、コンストラクタによって指定された です。コンストラクタに RenderingHintsオブジェクトが指定されている場合は、 補間ヒントとレンダリング品質ヒントを使用して、この操作の補間タイプを に設定します。

色変換のヒントは、色変換が必要な場合に使用することができます。 ディザリングのヒントを使用できます。注: の送信先と異なる宛先は、一致する必要があります。 Rasterオブジェクトの場合、ソース内のバンド数 は、宛先内のバンド数と等しくなければなりません。

だから、これは

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
関連する問題