Как отловить ошибку libpng с плохим адаптивным фильтром в PyQt5 - PullRequest
1 голос
/ 18 марта 2020

У меня есть список картинок, которые отображаются одновременно. Все они подобраны в течение l oop и добавлены в список.

К сожалению, некоторые PNG повреждены. Я не могу заранее сказать, какие повреждены, также нет возможности конвертировать такие PNG.

Должен быть способ игнорировать неисправные PNG и пропускать их.

В настоящее время мой код выглядит следующим образом:

for file in os.listdir(path):
        # checking if file is png format
        if file.endswith('.png'):
            pic             = os.path.join(self.path_selected, file)
            img_label       = qtw.QWidget()
            pixmap          = qtg.QPixmap(pic).scaledToWidth(img_width)

            img_label.setPixmap(pixmap)
            self.img_mosaique.layout().addWidget(img_label, img_row_count, img_col_count)

            # Adding paths of images to a list
            self.img_mosaique.set_image_path(pic)

Как вы можете видеть в настоящее время, я добавляю также неисправные изображения.

Насколько я выяснил, libpng не выдает никаких исключений. Я нашел решение использовать это

try:
    Image.open(path).tobytes()
except IOError:
    print('detect error img %s' % path)
    continue

Источник: предупреждение libpng: Игнорирование неверного адаптивного типа фильтра

Я не мог заставить его работать с этим решением.

1 Ответ

2 голосов
/ 18 марта 2020

Qt по соображениям эффективности не использует исключения для обозначения сбоев, но другими способами: в случае загрузки поврежденного изображения QPixmap это вернет нулевой QPixmap, так что вам нужно только проверить это.

for file in os.listdir(path):
    if file.endswith(".png"):
        pic = os.path.join(self.path_selected, file)
        img_label = qtw.QWidget()
        pixmap = qtg.QPixmap(pic)
        if pixmap.isNull():
            continue
        img_label.setPixmap(pixmap.scaledToWidth(img_width))
        self.img_mosaique.layout().addWidget(img_label, img_row_count, img_col_count)
        self.img_mosaique.set_image_path(pic)
...