You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求解释图像90度旋转代码的实现原理

图像90度旋转代码逻辑详解

首先得给你点个赞,能从180度旋转代码调整出90度的实现已经很棒了!咱们一步步拆解这段代码,把每个部分的作用和背后的逻辑说清楚:

先看完整代码块

OFImage image1 = new OFImage(image);
for (int x = 0; x < image.getWidth(); ++x) {
    for (int y = 0; y < image.getHeight(); ++y) {
        image.setPixel(y, x, image1.getPixel(image.getWidth() - x - 1, y));
    }
}

第一步:备份原图像

OFImage image1 = new OFImage(image);
这步和你熟悉的180度旋转逻辑一致——如果直接在原图像image上修改像素,后面读取的时候会拿到已经被改过的值,导致旋转结果出错。所以先复制一份完整的原图备份,所有需要读取的原始像素都从image1里拿,保证数据的准确性。

第二步:双层循环遍历像素

外层循环x遍历原图像的宽度(从0到原宽-1),内层循环y遍历原图像的高度(从0到原高-1)。这里的xy都是原图像的坐标,咱们要把每个原像素映射到旋转后的新位置上。

第三步:核心的像素映射逻辑(重点!)

这部分是你困惑的关键,咱们拆成两部分看:

  1. 目标位置:image.setPixel(y, x, ...)
    旋转90度后,原图像的宽高会互换——比如原图像是宽W、高H,旋转后就变成宽H、高W。所以原图像中代表“宽度方向”的x,会变成新图像中“高度方向”的y;原图像中“高度方向”的y,会变成新图像中“宽度方向”的x。这一步就是在做坐标的轴交换,为旋转后的尺寸适配做准备。

  2. 源像素位置:image1.getPixel(image.getWidth() - x - 1, y)
    这里对原x坐标做了翻转:原宽 - x - 1。举个例子,原图像最左边的像素x=0,会被转换成W-1(最右边的像素);原最右边的x=W-1,会转换成0(最左边)。这一步相当于把原图像在水平方向做了镜像翻转

把两步结合起来看效果

先对原图像做水平镜像翻转,再交换x和y坐标,最终实现的就是顺时针旋转90度的效果(等价于逆时针旋转270度)。你可以拿一张纸画几个点标上坐标,按照这个逻辑对应一遍,就能直观看到每个像素的移动路径了。

对比你熟悉的180度旋转:180度只需要同时翻转x和y坐标(W-x-1H-y-1),而90度旋转需要先翻转一个轴,再交换两个轴,这就是两者最核心的区别。

内容的提问来源于stack exchange,提问作者Joseph

火山引擎 最新活动