Python图像转美元符号ASCII算法报错AttributeError: __enter__求解
错误说明与解决方法
- 错误1:
AttributeError: __enter__
原因:你使用with上下文语法调用open_image函数,但该函数未实现,且返回对象不具备上下文管理要求的__enter__、__exit__方法。
解决方法:使用Python主流图片处理库Pillow读取图片,其内置的Image.open方法原生支持上下文管理语法。 - 错误2:缺失图片处理依赖
原因:未引入合适的图片读取模块
解决方法:运行命令pip install pillow安装Pillow库。 - 错误3:缩进语法错误
原因:main函数下的所有代码没有统一缩进,Python语法要求函数体内的代码必须缩进。
解决方法:将main定义后所有属于函数的代码统一缩进4个空格。 - 错误4:打印逻辑错误
原因:原有代码每次打印美元符号组合都会自动换行,无法拼接为完整图案;换行逻辑中的print(" ")存在语法错误。
解决方法:打印美元组合时添加end=''参数取消自动换行,满足换行条件时直接调用print()输出换行即可。 - 错误5:自定义方法未实现
原因:你调用的get_pixels()、get_width()方法没有对应实现逻辑。
解决方法:基于Pillow的原生接口封装对应逻辑,灰度图的width属性直接返回图片宽度,getdata()方法直接返回所有灰度像素的迭代器。
完整可运行代码
from PIL import Image def open_image(filename): # 打开图片并转为灰度模式,每个像素值为0-255的灰度值 img = Image.open(filename).convert('L') # 匹配你需要的调用接口 img.get_pixels = img.getdata img.get_width = lambda: img.width # 支持with上下文管理 return img def main(): intervals = [[0, 70], [71, 140], [141, 190], [191, 255]] dollar_pixels = [" ", " $ ", "$ $", "$$$"] assert len(intervals) == len(dollar_pixels) with open_image("donald.jpg") as image: for count, pixel in enumerate(image.get_pixels()): for (lower_limit, upper_limit), dollar_pixel in zip( intervals, dollar_pixels ): if lower_limit <= pixel <= upper_limit: # 取消自动换行,横向拼接图案 print(dollar_pixel, end='') break else: raise ValueError(f"pixel {pixel!r} not in any interval") if count and count % image.get_width() == 0: # 满足宽度条件时换行 print() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Helpman88
相关产品推荐
相关产品推荐

