繁体   English   中英

如何使用ImageJ-Plugin水平翻转图像?

[英]How to flip an image horizontally with an ImageJ-Plugin?

我想为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);
        }
    }
  }
}

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

无论如何,如果您想通过直接操纵像素来水平翻转(如代码示例中所示),则无需转到width ,而是需要将宽度减小一半( width / 2 )。

然后,您实际上需要反转“ left”和“ right”的两个像素

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

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

上面的代码中可能存在“一对一”错误,但是您应该明白这一点。

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();

但是,在这种情况下这不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM