使用PIL调整图片尺寸时无法保持宽高比,出现垂直拉伸水平压缩
问题排查与修复
你的ASCII图出现垂直拉伸、水平压缩的核心问题是resize函数的比例计算逻辑错误,没有考虑ASCII字符的显示特性——终端中字符的高度远大于宽度(常规比例约1.6-2:1),直接按像素宽高比缩放会导致变形。
错误原因分析
原代码中:
ratio = width / height / 1.65 new_height = int(ratio * new_width)
这个计算把原图的宽高比再除以字符比例,导致新高度被不合理缩小。当转换成ASCII字符后,字符本身的高度特性会让图片在垂直方向被拉伸,水平方向相对压缩。
修复方案
1. 修正resize函数的比例计算
调整逻辑,基于字符高宽比重新计算新高度:
def resize(image, new_width=100): width, height = image.size # 终端字符的高宽比,可根据实际显示效果调整(1.6-2之间都可以) char_aspect_ratio = 1.65 # 正确的新高度计算:原图高宽比 × 字符高宽比 × 新宽度 new_height = int((height / width) * char_aspect_ratio * new_width) resized_img = image.resize((new_width, new_height)) return resized_img
2. 修复Image.open的调用错误
你导入的是from PIL import Image,所以main函数中应该用Image.open(path)而非PIL.Image.open(path),规范写法修正如下:
try: image = Image.open(path) except: print(path, "is not a valid pathname to an image.") return
原理说明
ASCII字符的显示区域是“高宽不等”的,比如每个字符在终端中占的宽度是1单位,高度是1.65单位。所以我们需要让调整后的图片宽高比等于1/char_aspect_ratio(即宽度1,高度对应字符的高度比例),这样转换成字符后,整体比例才会和原图一致,不会出现拉伸压缩。
内容的提问来源于stack exchange,提问作者niamhlo
相关产品推荐
相关产品推荐

