Python PyQt5-FromicProfile:失败的最小标记大小健全性错误
我使用的是最新的PyQt5Python PyQt5-FromicProfile:失败的最小标记大小健全性错误,python,pyqt5,jpeg,icc,Python,Pyqt5,Jpeg,Icc,我使用的是最新的PyQt55.12.2,我在脚本中使用QPixmap或QIcon显示的每一张JPG图片都会收到一条奇怪的消息 qt.gui.icc: fromIccProfile: failed minimal tag size sanity 它没有引起任何问题,脚本也正常工作。问题是,我试图同时显示大量jpg图片(作为照片库),因此在打印每张照片的所有消息之前,窗口都没有响应 我花了几个小时试图在网上找到一些有用的东西,但不幸的是,似乎几乎没有人有同样的问题。我也在使用一些PNG文件,它们不
5.12.2
,我在脚本中使用QPixmap或QIcon显示的每一张JPG图片都会收到一条奇怪的消息
qt.gui.icc: fromIccProfile: failed minimal tag size sanity
它没有引起任何问题,脚本也正常工作。问题是,我试图同时显示大量jpg图片(作为照片库),因此在打印每张照片的所有消息之前,窗口都没有响应
我花了几个小时试图在网上找到一些有用的东西,但不幸的是,似乎几乎没有人有同样的问题。我也在使用一些PNG文件,它们不会引起这个错误,所以我假设问题出在jpg格式上。我尝试使用较旧的pyqt5版本,但唯一的区别是它们没有打印消息,但问题仍然存在
同时,我尝试使用此命令将这些消息静音,因为它们没有任何用处,但即使在控制台中没有打印,无响应窗口的问题也会持续几秒钟
def handler(*args):
pass
qInstallMessageHandler(handler)
编辑:我尝试将这些图像转换为PNG,但错误仍然存在。所以JPG格式不是问题我更深入地研究了ICC配置文件和颜色空间,似乎您的图片使用的颜色空间在某种程度上不是PyQt的标准 我的解决方案是将这些图片转换为经典的ICC配置文件,如sRGB。 下面是一个示例函数:
import io
from PIL import Image, ImageCms
def convert_to_srgb(file_path):
'''Convert PIL image to sRGB color space (if possible)'''
img = Image.open(file_path)
icc = img.info.get('icc_profile', '')
if icc:
io_handle = io.BytesIO(icc) # virtual file
src_profile = ImageCms.ImageCmsProfile(io_handle)
dst_profile = ImageCms.createProfile('sRGB')
img_conv = ImageCms.profileToProfile(img, src_profile, dst_profile)
icc_conv = img_conv.info.get('icc_profile','')
if icc != icc_conv:
# ICC profile was changed -> save converted file
img_conv.save(file_path,
format = 'JPEG',
quality = 50,
icc_profile = icc_conv)
使用PIL库是正确解决该错误的一种快速有效的方法。我正在用Pyside2制作GUI图像查看器,并且遇到了类似的问题。 图像加载良好,对于我的案例,没有性能问题,但我一直收到这些ICC警告。 我不想修复原始文件,因为我的应用程序应该只是一个查看器 我不知道这对您的情况是否有帮助,但我的解决方案是首先用 然后在显示图像的QT小部件类中,我将此图像加载到一个空的QPixmap上:
def on_change(self, path):
pixmap = QtGui.QPixmap()
image = load_image(path)
if image:
pixmap.convertFromImage(image)
if pixmap.isNull():
self.display_area_label.setText('No Image')
else:
self.display_area_label.setPixmap(pixmap)
def on_change(self, path):
pixmap = QtGui.QPixmap()
image = load_image(path)
if image:
pixmap.convertFromImage(image)
if pixmap.isNull():
self.display_area_label.setText('No Image')
else:
self.display_area_label.setPixmap(pixmap)