Pyqt5 löst das Problem des Anteils der auf Label platzierten Bilder

Pyqt5 löst das Problem des Anteils der auf Label platzierten Bilder


Ich habe in den letzten zwei Tagen an einem pyqt5-Projekt gearbeitet und bin auf ein kleines Problem gestoßen: Auf der Hauptoberfläche befindet sich ein 1000 x 1000 großes Label-Label zum Platzieren von Bildern und zum Identifizieren von Fehlern. Dieses Bild ist jedoch lang und hat eine Form von 4000 x 800. Wenn es auf dem Etikett platziert wird, geraten die Proportionen aus dem Gleichgewicht, was zu einer Verzerrung des Bildes führt.

Frage 1: Die für den vorherigen Test verwendeten Daten hatten eine Form von 4000 x 4000. Wenn sie auf dem Etikett platziert wurden, können Sie sie verwenden

self.label.setScaledContents(True)
sorgt dafür, dass sich das Bild an die Größe des Labels anpasst, sodass es 1000 x 1000 Pixel groß ist. Da es sich um eine proportionale Skalierung handelt, wird das Bild nicht verzerrt. Allerdings ist das Datenverhältnis dieses Mal das eines langen Streifens. Wenn der obige Code zur Anpassung verwendet wird, wird die Richtung der kurzen Seite gedehnt, was zu Bildverzerrungen führt und der Erkennungseffekt sehr unbefriedigend ist.

Lösung: Füllen Sie es zuerst, um eine quadratische Form zu erhalten

    def pic_adaptive_label_scale(self, view_image, label, resize=False, is_show=True):
        # 图片自适应label比例大小
        image_copy = None
        try:
            view_image = cv2.cvtColor(view_image, cv2.COLOR_RGB2BGR)
            height, width = view_image.shape[:2]  ##获取图片宽度
            if width > height:
                h_diff = abs(width - height) // 2
                top, bottom, left, right = h_diff, h_diff, 0, 0
            else:
                w_diff = abs(height - width) // 2
                top, bottom, left, right = 0, 0, w_diff, w_diff
            image_copy = cv2.copyMakeBorder(view_image, top, bottom, left, right, cv2.BORDER_CONSTANT,
                                            value=[0, 0, 0])

            if resize:
                new_width, new_height = label.width(), label.height()
                image_copy = cv2.resize(image_copy, (int(new_width), int(new_height)), interpolation=cv2.INTER_AREA)
        except Exception as e:
            logger.info(e)

        if is_show and image_copy is not None:
            label.setPixmap(
                QPixmap.fromImage(
                    QImage(image_copy.data, image_copy.shape[1], image_copy.shape[0], QImage.Format_RGB888)))
        return image_copy


Hier erhalte ich zuerst die Breite und Höhe, also die Größe 4080 x 808, erhalte die Differenz und fülle dann die linke und rechte Seite aus (schwarz).

Dann sollte das Ergebnis eine quadratische Größe haben (4080 x 4080).

Anstatt das adaptive Label zu verwenden, habe ich dann die Bildgröße direkt geändert und auf 1000 x 1000 skaliert.

Auf diese Weise kann das Bild vollständig auf dem Etikett angezeigt werden

おすすめ

転載: blog.csdn.net/qq_41879696/article/details/130986624