You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python从Discord服务器下载图片失败,无法识别已下载文件

问题分析与修复方案

先看你遇到的核心错误:

OSError: cannot identify image file '1527709726-madelbrot.jpg'

这个问题的根源很明显——你保存下载的图片时,错误地对原始二进制数据做了Base64编码,导致文件内容是Base64字符串的字节形式,而非真正的图片二进制流,系统当然识别不了。

错误代码定位

在你的图片下载逻辑里,这两行是罪魁祸首:

style_file.write(base64.encodebytes(r1))
# 以及下面的内容图片保存行
content_file.write(base64.encodebytes(r1))

从Discord CDN返回的r1已经是原始的图片二进制数据了,直接写入文件就行,完全不需要做Base64编码。你这一步操作相当于把图片变成了文本格式的编码内容,自然打不开。

修复方法

把这两处的base64.encodebytes(r1)直接替换成r1就好,修改后的代码片段如下:

风格图片下载修复

conn.request("GET", img_path, "", headers)
r1 = conn.getresponse().read()
# 用with语句自动管理文件,更安全
with open(style_img_filename, "wb") as style_file:
    style_file.write(r1)  # 去掉多余的Base64编码
os.chmod(style_img_filename, 0o777)

内容图片下载修复

conn.request("GET", img_path, "", headers)
r1 = conn.getresponse().read()
with open(content_img_filename, "wb") as content_file:
    content_file.write(r1)  # 同样去掉Base64编码
os.chmod(content_img_filename, 0o777)

额外优化建议

  1. with语句管理文件:我上面已经改了,这样不用手动调用close(),能避免因忘记关闭文件导致的资源泄漏或写入不完整问题。
  2. 检查HTTP响应状态:在读取响应内容前,先判断r1.status是否为200,确保图片确实下载成功,避免保存空文件或者错误的响应内容。
  3. 简化HTTP请求:你现在用的http.client比较繁琐,可以考虑换成requests库,一行代码就能完成GET请求和内容读取,代码会简洁很多(比如r = requests.get(url),然后r.content就是二进制数据)。

修改完之后重新运行脚本,下载的图片应该就能正常打开,neural_style.py也不会再抛出无法识别图片的错误了。

内容的提问来源于stack exchange,提问作者Alexander Lemieux

火山引擎 最新活动