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

使用Pillow不调用rotate函数实现图像90度逆时针旋转生成全黑图如何解决

问题原因分析
  • 递归函数内误用全局图像对象im:你定义的rotation函数接收image作为入参,但函数内所有裁剪、复制操作都用了全局加载的原图im,而非传入的子块对象,递归逻辑完全不生效,子块的旋转操作没有作用到正确的对象上。
  • 裁剪区域坐标错误:你在计算右上角、左下角裁剪块的边界时误用了高度hauteur作为宽度边界,即使是正方形图像,当递归到子块时,子块的宽高和原图不一致,会直接裁剪到无效区域,导致像素全黑。
  • 递归内重复创建新图像对象:每次递归都会复制全局原图创建new对象,子块的修改无法传递到上层,最终拼接的都是未处理的原图块。
  • 保存操作位置错误:保存逻辑放在递归函数内部,每次递归都会覆盖写入输出文件,最终输出的是最内层递归生成的全黑图像。
修正后可运行代码
from PIL import Image

def rotation(image):
    largeur, hauteur = image.size
    # 操作当前传入的image对象,而非全局im
    new = image.copy()
    if largeur > 1:
        moitie = largeur // 2
        # 裁剪当前传入的image的四个块,不是全局im
        a = image.crop((0, 0, moitie, moitie))  # 左上
        b = image.crop((moitie, 0, largeur, moitie))  # 右上
        c = image.crop((moitie, moitie, largeur, hauteur))  # 右下
        d = image.crop((0, moitie, moitie, hauteur))  # 左下
        # 递归旋转四个子块
        a_rot = rotation(a)
        b_rot = rotation(b)
        c_rot = rotation(c)
        d_rot = rotation(d)
        # 按逆时针旋转90度的规则拼接子块
        new.paste(d_rot, (0, 0))
        new.paste(a_rot, (moitie, 0))
        new.paste(b_rot, (moitie, moitie))
        new.paste(c_rot, (0, moitie))
    # 返回当前层旋转后的图像,供上层拼接
    return new

if __name__ == '__main__':
    im = Image.open("smiley.bmp")
    rot_img = rotation(im)
    rot_img.save("smiley1.png")
    rot_img.show()
注意事项
  • 你当前用的分治递归旋转逻辑仅支持边长为2的n次幂的正方形图像,如果是其他尺寸的正方形需要补充边界填充逻辑。
  • 所有操作都要在传入的图像参数对象上执行,不要在递归函数内调用全局的原图对象。

内容的提问来源于stack exchange,提问作者Thanks for the help

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:03