需求描述:
我们有一个固定大小的窗口用于显示图像。
然而导入的图像尺寸是不定的。
我们希望:
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 = QtWidgets.QLabel(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()) // 2image_y = (self.image_widget.height() - im.height()) // 2self.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) # 设置图片显示