如何无需下载图片,直接从链接在控制台打印图片?
无需下载图片直接在控制台打印的方法
你完全可以不用把图片下载到本地文件,直接通过网络获取图片的二进制数据,再用Pillow处理后输出到控制台,下面给两种实用的实现方式:
方法一:转成ASCII字符画
这种方式兼容性强,几乎所有终端都能显示,原理是把图片转成灰度图后,将像素亮度映射为不同的ASCII字符。
import requests from PIL import Image from io import BytesIO # 目标图片链接 img_url = "https://cdn.discordapp.com/avatars/826439366439993354/c107a313dba5b75dd388c2fca5df68f9.png" # 直接获取图片的二进制数据 resp = requests.get(img_url) resp.raise_for_status() # 确保请求没出错 # 用BytesIO把二进制数据包装成类文件对象,传给Pillow加载 img = Image.open(BytesIO(resp.content)).convert("L") # 转为灰度图 # 调整图片尺寸适配控制台,可根据自己终端宽度修改new_width width, height = img.size new_width = 80 new_height = int((height / width) * new_width * 0.5) # 0.5是修正字符宽高比的系数 img = img.resize((new_width, new_height)) # 定义从暗到亮的ASCII字符集 ascii_chars = "@%#*+=-:. " # 把每个像素映射成对应的ASCII字符 pixels = img.getdata() ascii_str = "".join([ascii_chars[pixel // 25] for pixel in pixels]) # 分割成每行对应宽度的字符串 ascii_lines = [ascii_str[i:i+new_width] for i in range(0, len(ascii_str), new_width)] # 打印结果 print("\n".join(ascii_lines))
方法二:在真彩色终端显示彩色像素块
如果你的终端支持24位真彩色(比如Windows Terminal、iTerm2、Linux下的GNOME Terminal等),可以直接打印带颜色的方块,还原度比ASCII字符画高很多。
import requests from PIL import Image from io import BytesIO img_url = "https://cdn.discordapp.com/avatars/826439366439993354/c107a313dba5b75dd388c2fca5df68f9.png" resp = requests.get(img_url) resp.raise_for_status() img = Image.open(BytesIO(resp.content)) # 调整尺寸适配终端 new_width = 40 width, height = img.size new_height = int((height / width) * new_width * 0.5) img = img.resize((new_width, new_height)) # 逐像素生成带ANSI颜色码的方块 output_lines = [] for y in range(new_height): current_line = [] for x in range(new_width): r, g, b = img.getpixel((x, y))[:3] # 用ANSI 24位颜色控制码设置方块颜色 current_line.append(f"\033[38;2;{r};{g};{b}m■\033[0m") output_lines.append("".join(current_line)) # 打印彩色图片 print("\n".join(output_lines))
注意事项
- 先安装依赖库:
pip install requests pillow - 两种方法里的
new_width可以根据你的终端宽度自行调整,数值越大显示越细致 - 第二种方法如果终端不支持真彩色,会显示乱码或者颜色异常
内容的提问来源于stack exchange,提问作者container
相关产品推荐
相关产品推荐

