您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

【pyqt5】 实现在窗口内非满屏,居中显示图像(QPixmap)。

需求描述:
我们有一个固定大小的窗口用于显示图像。
然而导入的图像尺寸是不定的。
我们希望:
1.在图像长宽均不超过窗口时,实现图像1:1显示,并位于窗口居中显示。
2.图像长或宽超过窗口的长或宽是,按一定比例进行缩放,缩放后长或宽均不超过窗口长宽,且在窗口中居中显示。
3.所有显示图像的长宽比均不改变.

先看效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:
我们看见的主窗口就是一个QWidget控件。
然后显示图像的就是QLabel控件,从属于QWidget窗口。
QLabel的尺寸等于图像尺寸。
每一次读取图像都调用QLabel的setGeometry函数重新设置并显示。

代码:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import QtCore, QtGui, QtWidgets
import os
import cv2

创建相关控件:

        # 4. 创建主窗口
        self.image_widget = QtWidgets.QWidget(self)
        self.image_widget.setGeometry(QtCore.QRect(240, 110, 1030, 560))
        self.image_widget.setStyleSheet("QWidget{background-color:rgb(188,188,188);border:none}")
        self.image_label = myWidgets.Image_Label(self.image_widget)
        self.image_label.setGeometry(QtCore.QRect(0, 0, 1030, 560))


        # 5.创建下方文字栏
        self.text_widget = QtWidgets.QWidget(self)
        self.text_widget.setGeometry(QtCore.QRect(240, 680, 1030, 30))
        self.text_widget.setStyleSheet("QWidget{background-color:rgb(200,223,200);border:none}")

然后每一次显示图像都调用:

		img= QImage(image_file)  # 创建QImage图像
        scale_1 = im.width() / self.image_widget.width()
        scale_2 = im.height() / self.image_widget.height()
        scale = max(scale_1, scale_2)
        print(scale,im.width(),im.height() )
        if scale >1:
            w = int(im.width()//scale)
            h = int(im.height()//scale)
            im = im.scaled(int(im.width()/scale), int(im.height()/scale))
            str = "图像(width,height)=({},{});  缩放比例为:{:.3f}%".format(im.width(),im.height(),1/scale * 100)
            self.label_text.setText(str)
        else:
            str = "图像(width,height)=({},{});  缩放比例为:100%".format(im.width(), im.height())
            self.label_text.setText(str)

        image_x = (self.image_widget.width() - im.width()) // 2
        image_y = (self.image_widget.height() - im.height()) // 2
        self.image_label.setGeometry(QtCore.QRect(image_x, image_y, im.width(), im.height()))

        size = QSize(im.width(), im.height())
        pixImg = QPixmap.fromImage(im.scaled(size, Qt.IgnoreAspectRatio))
        self.image_label.setPixmap(pixImg)  # 设置图片显示

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进