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

你的逻辑是错误的。你得到的是正常的:你不是在处理你的图像的一半,而是水平翻转你的图像的一半和另一半的两倍(如果我没记错的话)。

无论如何,如果您想通过自己直接操作像素来水平翻转,就像在您的代码示例中那样,那么您需要转到宽度的一半(width/2) ,而不是转到width 。

然后,您实际上需要从“左”和“右”反转两个像素

这是一个有效的水平翻转:

    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是正确的,您应该只迭代图像的一半,并且您需要在覆盖之前保存另一侧的值。

但是,还有两点可能值得一提 - 一个是ImageProcessor 类已经有一个名为flipHorizo​​ntal的方法,因此您可以将代码简化为:

public class flipHorizontal implements PlugInFilter {

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

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

值得一提的另一点是,您似乎误解了这条线的含义:

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 回答