2

画像を水平方向に反転する ImageJ 用の Java プラグインを開発したいと考えています。しかし、私のコードは画像の半分しか反転していません。たぶん、イメージコピーの構成または出力に問題がありますか?

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);
        }
    }
  }
}
4

2 に答える 2

0

あなたの論理は間違っています。あなたが得るものは正常です:あなたはあなたの画像の半分を処理していませんが、あなたの画像の半分と残りの半分の2倍を水平に反転しています(私が間違っていない場合)。

とにかく、コードサンプルのように、自分でピクセルを直接操作して水平方向に反転する場合は、widthに移動する代わりに、幅の半分( width / 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 );
        }
    }

上記のコードには「オフバイワン」エラーがある可能性がありますが、その考えを理解する必要があります。

于 2012-04-30T11:57:54.193 に答える
0

TacticalCoderは、画像の半分まで反復するだけでよいこと、および上書きする前に反対側から値を保存する必要があることは正しいです。

ただし、作成する価値のある追加のポイントが 2 つあります

public class flipHorizontal implements PlugInFilter {

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

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

作成する価値のあるもう 1 つのポイントは、この行の意味を誤解しているように見えるということです。

ImageProcessor copy = ip;

と同じオブジェクトへの別の参照を作成しているだけなipので、次のようになります。

copy.putPixel(x,y,p);

... と:

ip.putPixel(x,y,p);

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

ImageProcessor copy = ip.duplicate();

ただし、この場合は必要ありません。

于 2012-04-30T14:15:14.657 に答える