我想为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);
}
}
}
}
答案 0 :(得分:0)
你的逻辑错了。你得到的是正常的:你没有处理你图像的一半,而是在你的图像的一半水平翻转,另一半翻了一半(如果我没弄错的话)。
无论如何,如果你想通过自己直接操纵像素来水平翻转,就像你的代码示例一样,那么你需要去宽度的一半(宽度),而不是去 width 。 / 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 );
}
}
上面的代码中可能存在“off-by-one”错误,但您应该明白这一点。
答案 1 :(得分:0)
TacticalCoder是正确的,您应该只在图像的一半处迭代,并且需要在覆盖之前保存另一侧的值。
还有两点值得一提,但有一点是ImageProcessor class已经有一个名为flipHorizontal的方法,因此您可以将代码简化为:
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();
但是,在这种情况下,这不是必需的。