在循环中使用PIL transpose方法报错:Image模块无属性i
问题解决:PIL transpose循环迭代报错修复
错误原因
你代码里的coins.transpose(Image.i)写法存在两个核心问题:
- 属性访问逻辑错误:
Image.i会让Python把i当作Image模块的固定属性名,但i是循环变量,存储的是字符串(如'FLIP_LEFT_RIGHT'),Python不会自动将字符串映射为模块的对应常量,因此触发AttributeError。 - 对象类型不匹配:
skimage.data.coins()返回的是numpy数组,并非PIL的Image对象,直接调用transpose方法会引发额外兼容性问题。
修复方案
提供两种可行的修复方式:
方式一:使用getattr()动态映射字符串到Image常量
通过getattr()函数动态获取Image模块中对应字符串的常量值,同时将numpy数组转为PIL Image对象:
from PIL import Image from skimage import data flips = ['FLIP_LEFT_RIGHT','FLIP_TOP_BOTTOM'] # 将skimage返回的numpy数组转为PIL Image对象 coins_img = Image.fromarray(data.coins()) for flip_mode in flips: # 动态获取对应翻转模式的常量 flipped_img = coins_img.transpose(getattr(Image, flip_mode)) display(flipped_img)
方式二:直接存储Image常量到列表
跳过字符串环节,直接将Image模块的翻转常量存入列表,无需动态映射:
from PIL import Image from skimage import data # 直接使用Image模块的内置常量 flips = [Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM] coins_img = Image.fromarray(data.coins()) for flip_mode in flips: flipped_img = coins_img.transpose(flip_mode) display(flipped_img)
内容的提问来源于stack exchange,提问作者Alain Michael Janith Schroter
相关产品推荐
相关产品推荐

