2012-04-30 35 views
2

画像を水平方向に反転させるImageJのJava-Pluginを開発したいと思います。 しかし、私のコードは画像の半分しか反転しません。たぶん、画像コピーの構成や出力に何か問題がありますか?ImageJ-Pluginを使って画像を水平に反転させる方法は?

public class flipHorizontal implements PlugInFilter { 

public int setup (String arg, ImagePlus imp) 
{ 
    return DOES_ALL; 
} 

public void run (ImageProcessor ip) 
{ 
    int height=ip.getHeight(); 
    int width=ip.getWidth(); 

    ImageProcessor copy = ip; 


    for (int x=0; x<width; x++) { 

     for (int y=0; y<height; y++) { 
      int p=ip.getPixel(width-x-1,y); 
      copy.putPixel(x,y,p); 
     } 
    } 
    } 
} 
+0

btw大歓迎ですので、解決策があなたのために働いていれば、アップして回答を受け入れてください(SOさんの働く方法です)。 – TacticalCoder

答えて

0

ロジックが間違っています。あなたが得ることは普通です:イメージの半分を処理するのではなく、イメージの半分と他の半分の2倍に水平にフリップする(私が間違っていなければ)。あなたは、あなたのコードサンプルのように、直接ピクセルを自分で操作する代わりにに行くことによって水平に反転する場合

とにかく、あなたは半分の幅(幅/ 2)に行く必要があります。あなたは、実際に

を「左」と「右」から2つのピクセルを反転させる必要がある

はここで働く左右反転です:

for (int x = 0; x < w/2; x++) { 
     for (int y = 0; y < h; y++) { 
      final int l = tmp.getRGB(w - (x + 1), y); 
      final int r = tmp.getRGB(x, y); 
      tmp.setRGB(x, y, l); 
      tmp.setRGB(w - (x + 1), y, r); 
     } 
    } 

「オフ・バイ・ワン」のエラーがあるかもしれません上記のコードでは、あなたはアイデアを得る必要があります。

0

TacticalCoderは、画像全体の半分にしか反復しないでください。上書きする前に、反対側の値を保存する必要があります。

しかし、作る価値があるかもしれない二つの追加のポイントがあります - あなたがあなたのコードを簡素化することができますので、1メソッドが呼び出されたflipHorizontalすでにImageProcessor class次のとおりですだろう

public class flipHorizontal implements PlugInFilter { 

    public int setup (String arg, ImagePlus imp) { 
     return DOES_ALL; 
    } 

    public void run (ImageProcessor ip) { 
     ip.flipHorizontal(); 
    } 
} 

他のポイントは、価値作りは、あなたがこの行が何を意味するのか誤解しているようですということである:ちょうどそう、ipと同じオブジェクトへの別の参照を作成しています

ImageProcessor copy = ip; 

copy.putPixel(x,y,p); 

...と:

ip.putPixel(x,y,p); 

は...まったく同じ効果を持ちます。同じピクセルデータを表す新しいImageProcessorを作成するには、次のようにします。

ImageProcessor copy = ip.duplicate(); 

ただし、これは必須ではありません。

関連する問題