使用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
相关产品推荐
相关产品推荐

