[英]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 类已经具有一个名为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();
但是,在这种情况下这不是必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.