PyQt 界面展示图片问题

本文详细介绍了如何在PyQT5环境中使用QLabel显示Base64编码的图片以及通过opencv或PIL读取图片再转化为QPixmap进行显示。首先,通过服务器获取Base64编码的图片数据,然后解码并在QLabel中显示。解决显示问题的关键在于调整QLabel的scaledContents属性。其次,展示了如何利用opencv读取图片并转换为Qt兼容格式在QLabel中展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

界面展示图片有两种方式:图片,Base64编码的图片

1,通过图片的地址路径加载图片并显示

        pixmap = QPixmap(150, 150)
        ba = base64.b64decode(self.QRCodeURL)   // 显示其他格式的图片在这里改
        pixmap.loadFromData(ba)
        self.label.setPixmap(pixmap)
        self.label.setScaledContents(False)

       //self.QRCodeURL,为图片Base64编码形成的字符串
图片数据是我自己编写的Django服务器上以Base64编码的图片,在本地接收后解码为图片显示在QLabel中。

服务器代码:

def query_userinfo(request):
    name = request.POST.get('name')
    name_check = charge.objects.get(name = name)
    dest = base64.b64encode(name_check.img)
    returnData = {
                    'code':'0',
                    'msg':'success',
                    'name':name,
                    'mobile':name_check.phonenum,
                    'iccard':name_check.icnum,
                    'pic':dest.decode('utf-8')
                }
return HttpResponse(json.dumps(returnData), content_type="application/json")
本地一开始的代码,这个代码无法再QLabel中显示图片:

    def query_userinfo(self):
        postData = {
            'name':self.lineEdit_3.text()
        }
        r = requests.post("http://127.0.0.1:8000/app01/queryuserinfo/", data=postData)
        json_data = json.loads(r.text)
        self.mobile_show.setText(json_data.get('mobile'))
        self.precard_show.setText(json_data.get('iccard'))
        pic_data = json_data.get('pic').encode('utf-8')
        pixmap = QPixmap(151,171)
        ba = QtCore.QByteArray.fromBase64(pic_data)
        pixmap.loadFromData(ba)
        self.pic_show.setPixmap(pixmap)
        return None
无法显示的原因就是QLabel的大小和我的图片不匹配,后来对QPixmap调用Scaled函数后依旧不行。

pixmap.scaled(151, 171, aspectRatioMode = Qt.IgnoreAspectRatio)
后来才发现添加

self.pic_show.setScaledContents(True)
这行代码后就可以正确显示。这个函数的意义就在于是否将缩放其内容以填充所有可用空间。当启用时,标签显示一个像素图,它将缩放像素图以填充可用空间。该属性的默认值是False。

2,通过opencv 或者PIL库读取图片数组,然后通过QPixmap展示图片

from PyQt5.Qt import *
import cv2
 
# 设置展示控件
pic_show_label = QtWidgets.QLabel()
# 设置窗口尺寸
pic_show_label.resize(500,500)
 
# 图片路径
img_path="image_path.jpg"
 
# 通过cv读取图片
img=cv2.imread(img_path)
# 通道转化
RGBImg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 将图片转化成Qt可读格式
image=QtGui.QImage(RGBImg,RGBImg.shape[1],RGBImg.shape[0],QtGui.QImage.FormatRGB888)
 
# 加载图片,并自定义图片展示尺寸
image = QtGui.QPixmap(image).scaled(400, 400)
# 显示图片
pic_show_label.setPixmap(image
————————————————
版权声明:本文为优快云博主「韩小哥的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/python_pycharm/article/details/102593072

参考:

关于PyQT5的QLabel不显示图片的问题 - it610.com

PyQt5 界面展示图片问题(QtGui.QPixmap)_python_pycharm的博客-优快云博客

### PyQt5中实现界面设计以显示图像 #### 使用QLabel组件显示原始图片和处理后的效果对比图 为了创建一个可以展示原图以及经过不同操作之后的效果图的应用程序,通常会选择`QLabel`作为承载图像的主要控件。对于左侧用于放置初始加载的图片部分,可以通过设置`QLabel`来适应不同的窗口大小变化[^1]。 ```python self.original_label = QLabel(self) pixmap = QPixmap(image_path).scaled(300, 300, Qt.KeepAspectRatio) self.original_label.setPixmap(pixmap) ``` 这里的关键在于利用`QPixmap`对象读取指定路径下的图片文件,并调用`scaled()`函数调整其尺寸以便更好地适配标签空间;同时保持宽高比例不变(`Qt.KeepAspectRatio`)从而确保不会因为强制缩放而破坏原有图形结构。 #### 添加多种图像处理功能按钮 针对中间区域提供的诸如灰度转换、应用滤镜等功能,则可通过定义多个继承自`QPushButton`类的对象实例完成交互逻辑构建。每一个按钮都应绑定特定槽函数负责执行对应的任务处理流程[^3]。 ```python def setup_ui(self): # 创建按钮组 self.gray_scale_btn = QPushButton('Gray Scale', self) self.blur_effect_btn = QPushButton('Blur Effect', self) # 连接信号与槽 self.gray_scale_btn.clicked.connect(self.apply_gray_scale) self.blur_effect_btn.clicked.connect(self.apply_blur_effect) # 布局管理... ``` 上述代码片段展示了如何初始化两个分别代表“转为灰阶”和“添加模糊”的控制按键,并通过`.clicked.connect()`机制关联各自的目标动作处理器——即后续会介绍的具体算法实现过程。 #### 动态更新右侧预览区的内容 每当用户触发任一编辑命令后,都需要及时刷新右边的结果视窗以反映最新的视觉反馈给使用者知晓当前所做的更改。这一步骤往往涉及到重新渲染目标画布上的内容并再次传递至对应的`QLabel`容器内呈现出来。 ```python def apply_changes_to_preview(self, processed_pixmap): """ 更新预览面板 """ preview_label = QLabel(self) preview_label.setPixmap(processed_pixmap.scaled( 300, 300, Qt.KeepAspectRatio)) layout.addWidget(preview_label, row=0, column=2) ``` 此段落说明了怎样接收来自其他地方产生的已加工过的`QPixmap`实体参数,随后按照既定规格进行适当裁剪后再安置于布局中的固定位置上供查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值