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)
额外优化建议
- 用
with语句管理文件:我上面已经改了,这样不用手动调用close(),能避免因忘记关闭文件导致的资源泄漏或写入不完整问题。 - 检查HTTP响应状态:在读取响应内容前,先判断
r1.status是否为200,确保图片确实下载成功,避免保存空文件或者错误的响应内容。 - 简化HTTP请求:你现在用的
http.client比较繁琐,可以考虑换成requests库,一行代码就能完成GET请求和内容读取,代码会简洁很多(比如r = requests.get(url),然后r.content就是二进制数据)。
修改完之后重新运行脚本,下载的图片应该就能正常打开,neural_style.py也不会再抛出无法识别图片的错误了。
内容的提问来源于stack exchange,提问作者Alexander Lemieux




