Python手动旋转图片时如何修复‘IndexError: image index out of range’错误
图片旋转逐像素实现的索引越界问题解决
问题描述
尝试通过逐像素复制的方式旋转图片(原图片宽360px、高480px),但代码运行时持续报错,仅当y的循环范围小于3时无错误。相关代码及报错信息如下:
代码
def rotate(img): height = int(img.getHeight()) width = int(img.getWidth()) turn = image.EmptyImage(height, width) xs = 0 ys = 0 for y in range(height): for x in range(width): px = img.getPixel(x, y) r = px.getRed() g = px.getGreen() b = px.getBlue() turnpx = image.Pixel(r, g, b) turn.setPixel(x+(width-xs), y, turnpx) xs+=1 return turn def main(): img6 = image.Image("images//arch.gif") img7 = rotate(img6) if img7: win7 = image.ImageWin(img7.getWidth(), img7.getHeight(), "Win7") img7.draw(win7) main()
报错信息
Traceback (most recent call last): File "C:\programs\test.py", line 28, in <module> main() File "C:\programs\test.py", line 23, in main img7 = rotate(img6) File "C:\programs\test.py", line 17, in rotate turn.setPixel(x+(width-xs), y, turnpx) File "C:\programs\image.py", line 467, in setPILPixel self.im.putpixel((x,y),pixel.getColorTuple()) File "C:\programs\anaconda3\Lib\site-packages\PIL\Image.py", line 2136, in putpixel return self.im.putpixel(xy, value) IndexError: image index out of range
错误原因及修正方案
1. 核心错误
当前代码的目标坐标计算逻辑完全错误:x+(width-xs)既不符合旋转的像素映射规则,且xs变量在每轮y循环后未重置,导致后续循环中xs持续累加,最终计算出的坐标超出新图片的像素范围,触发索引越界。
2. 正确的旋转坐标映射
以顺时针旋转90度为例:
- 原图片参数:宽
W,高H - 旋转后新图片参数:宽
H,高W - 原像素
(x, y)对应新图片的坐标为(y, W - 1 - x)
如果需要逆时针旋转90度,对应坐标为(H - 1 - y, x)。
3. 修正后的代码
def rotate(img): height = int(img.getHeight()) width = int(img.getWidth()) # 旋转90度后,新图片宽为原图片高度,高为原图片宽度 turn = image.EmptyImage(height, width) for y in range(height): for x in range(width): px = img.getPixel(x, y) r = px.getRed() g = px.getGreen() b = px.getBlue() turnpx = image.Pixel(r, g, b) # 顺时针旋转90度的坐标映射 target_x = y target_y = width - 1 - x turn.setPixel(target_x, target_y, turnpx) return turn def main(): img6 = image.Image("images//arch.gif") img7 = rotate(img6) if img7: win7 = image.ImageWin(img7.getWidth(), img7.getHeight(), "Win7") img7.draw(win7) main()
关键调整
- 移除了无意义的
xs、ys变量,改用符合旋转逻辑的坐标映射公式 - 确保所有原像素都被映射到新图片的合法坐标范围内,避免越界
内容的提问来源于stack exchange,提问作者Achromatic
相关产品推荐
相关产品推荐

