如何将网络下载的JPEG字节流加载到PyQt4.QtGui.QImage?
我来帮你搞定这个把网络下载的JPEG字节流加载到PyQt4 QImage里的问题~先给你一个经过验证的完整代码示例,应该能解决你的问题:
import requests from PyQt4.QtGui import QImage, QByteArray # 第一步:用requests下载图片字节流 response = requests.get("你的目标图片URL") response.raise_for_status() # 先确保请求成功,避免拿到不完整的字节流 image_bytes = response.content # 第二步:把Python字节流包装成PyQt的QByteArray q_byte_array = QByteArray(image_bytes) # 第三步:加载到QImage里 image = QImage() if not image.loadFromData(q_byte_array, "JPG"): print("哎呀,图片加载失败了!") else: print("搞定!图片尺寸是:{}x{}".format(image.width(), image.height()))
接下来给你梳理几个容易踩坑的地方,看看是不是之前的问题出在这里:
先确认下载的字节流是完整有效的:
有时候请求返回了200,但拿到的字节流可能不完整或者损坏。你可以先把image_bytes写入本地文件,看看能不能用系统自带的图片查看器打开,确认下载的内容是正常的JPEG。代码如下:with open("test_download.jpg", "wb") as f: f.write(image_bytes)检查你的PyQt4是否真的支持JPEG:
虽然官方文档说支持,但有些PyQt4的安装包(比如自己编译时没开JPEG支持,或者某些精简版)可能没有带JPEG插件。你可以去PyQt4的插件目录里找一找:Windows下是qjpeg4.dll,Linux是libqjpeg.so,Mac是libqjpeg.dylib。如果找不到这个文件,那大概率是PyQt4本身没装JPEG支持,得重新安装完整版本。记得明确指定图片格式:
调用loadFromData的时候,第二个参数一定要写上"JPG"或者"JPEG",别让QImage自动猜。有时候字节流的头部信息不够清晰,手动指定格式能避免识别错误。加载后一定要检查QImage状态:
加载完成后用image.isNull()判断一下,如果返回True,说明加载失败了,这时候就可以针对性排查字节流或者环境问题。
另外提一句,如果你之前试过直接用QImage(image_bytes, 宽度, 高度, 像素格式)这种构造函数,那大概率会出错——这种方式需要你提前知道图片的精确尺寸和像素格式,而从字节流加载图片,用loadFromData才是正确的姿势,它会自动解析图片的元数据。
内容的提问来源于stack exchange,提问作者tgrandje

