提问人:KajSech 提问时间:11/2/2023 最后编辑:KajSech 更新时间:11/2/2023 访问量:62
翻转(镜像)映像 Java
Flip (Mirror) Image Java
问:
我正在尝试镜像或翻转图像,但我的代码只镜像了一半的图像,我不知道如何修复它。这是原始图像:原始图像 我试图将其作为我的最终结果:翻转/镜像图像
我还想澄清一下,我知道我可以利用 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);
}
}
答:
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
和相反的位置。您想要交换/交换这两个像素。只要。w
i < 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();
它不仅速度更快,而且更简单
评论
0赞
KajSech
11/2/2023
是的,你是对的,这种方法要容易得多,但我想弄清楚如何在不使用 API 支持的情况下镜像图像。
评论