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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:15:37