Python PyQt5-FromicProfile:失败的最小标记大小健全性错误

Python 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文件,它们不

我使用的是最新的PyQt5
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)