翻转(镜像)映像 Java

Flip (Mirror) Image Java

提问人:KajSech 提问时间:11/2/2023 最后编辑:KajSech 更新时间:11/2/2023 访问量:62

问:

我正在尝试镜像或翻转图像,但我的代码只镜像了一半的图像,我不知道如何修复它。这是原始图像:原始图像 我试图将其作为我的最终结果:翻转/镜像图像

我还想澄清一下,我知道我可以利用 2DGraphics 和 API 支持,但我正在尝试弄清楚如何通过操作 2D 数组来镜像图像

这是我的代码和我得到的结果:

public static void applyMirror(BufferedImage img) {
int width = img.getWidth();
int height = img.getHeight();
for(int j = 0; j < height; j++){
  for(int i = 0, w = width - 1; i < width; i++, w--){
    int p = img.getRGB(i, j);
    img.setRGB(w, j, p);
  }
}

我的结果

Java 数组 方法 bufferedimage

评论

0赞 shmosel 11/2/2023
我喜欢半镜像的结果。
1赞 Mike 'Pomax' Kamermans 11/2/2023
欢迎来到 Stackoverflow。请记得阅读如何提出一个好问题,它解释了你不应该发布代码的图像。将实际代码放在您的帖子中,理想情况下,在它周围放置足够的代码,以便它是一个最小的可重现示例
0赞 MadProgrammer 11/2/2023
例如;例子;例子;;
0赞 MadProgrammer 11/2/2023
0赞 Mike 'Pomax' Kamermans 11/2/2023
@MadProgrammer当然,如果其中任何一个是重复的,只需投票关闭为重复。

答:

0赞 Joop Eggen 11/2/2023 #1

你必须走 i 到 width/2。 否则,您将每个 (i, width - i - 1) 交换两次。;)

并交换两个相反的像素。

–-----

法典

for (int i = 0, w = width - 1; i < w; ++i, --w) {
    int pi = img.getRGB(i, j);
    int pw = img.getRGB(w, j);
    img.setRGB(i, j, pw);
    img.setRGB(w, j, pi);
}

这可确保您不会像代码那样写入已更改的像素。

评论

0赞 KajSech 11/2/2023
因此,我使用 i < 宽度 / 2 而不是 i < 宽度?你能澄清一下交换两个相反的像素是什么意思吗?
0赞 Joop Eggen 11/2/2023
i和相反的位置。您想要交换/交换这两个像素。只要。wi < w
1赞 MadProgrammer 11/2/2023 #2

只需使用可用的 API 支持即可。一个非常简单的技巧是简单地使用您想要镜像的轴上的负值来缩放图像,例如......

BufferedImage mirrored = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = mirrored.createGraphics();
g2d.scale(-1, 1);
g2d.translate(-source.getWidth(), 0);
g2d.drawImage(source, 0, 0, null);
g2d.dispose();

它不仅速度更快,而且更简单

enter image description hereenter image description here

评论

0赞 KajSech 11/2/2023
是的,你是对的,这种方法要容易得多,但我想弄清楚如何在不使用 API 支持的情况下镜像图像。