请求解释图像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)。这里的x和y都是原图像的坐标,咱们要把每个原像素映射到旋转后的新位置上。
第三步:核心的像素映射逻辑(重点!)
这部分是你困惑的关键,咱们拆成两部分看:
目标位置:
image.setPixel(y, x, ...)
旋转90度后,原图像的宽高会互换——比如原图像是宽W、高H,旋转后就变成宽H、高W。所以原图像中代表“宽度方向”的x,会变成新图像中“高度方向”的y;原图像中“高度方向”的y,会变成新图像中“宽度方向”的x。这一步就是在做坐标的轴交换,为旋转后的尺寸适配做准备。源像素位置:
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-1和H-y-1),而90度旋转需要先翻转一个轴,再交换两个轴,这就是两者最核心的区别。
内容的提问来源于stack exchange,提问作者Joseph




