You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:53:14