返回顶部

[Python] Pyqt5 实时图像滚动

[复制链接]
awagink 显示全部楼层 发表于 2021-1-3 19:55:10 |阅读模式 打印 上一主题 下一主题
实时图像
写了一个关于实时图像滚动显示的例子,做个记录。

滚动算法:
662225-20160511165631984-705027707.png
难点:
将内存数据绘制到界面,需要用到QImage和QPixmap,使用QImage转换一下,具体参见代码。这个费了好大劲才弄出来(网上的资料大都很简单,处理个QImage打开保存啊等等操作,项目实用性不强。)

from PIL import Image
import numpy as np
import threading
import time

class GraphicWidget(QWidget):
    def __init__(self):
        super(GraphicWidget,self).__init__()
        self.threadStop = False
        self.drawWidth = 1080
        self.drawHeight = 800
        self.imgWholeData = None
        self.imgScreenData = np.zeros([self.drawHeight,self.drawWidth],np.uint8)
        self.imgTotalLines = 0
        self.imgWidth = 0
        self.threadStop = True
        pass

    def doscroll(self):

        if self.threadStop:
            img = Image.open("d:/test2.png")
            self.imgWholeData = np.array(img)
            self.imgTotalLines, self.imgWidth = self.imgWholeData.shape

            scrollThread = threading.Thread(target = self.scroll)
            scrollThread.start()

    def stop(self):
        self.threadStop = True

    def scroll(self):
        step = 5
        srcStartLine = 0
        srcEndLine = step
        destEndLine = step
        self.threadStop = False
        while not self.threadStop:
            if destEndLine > self.drawHeight:
                destEndLine = self.drawHeight

            if srcEndLine > self.drawHeight:
                srcStartLine = srcEndLine - self.drawHeight

            if srcEndLine > self.imgTotalLines:
                print("scroll end")
                self.threadStop = True
                break
            if srcStartLine < self.drawHeight:
                self.imgScreenData = np.zeros([self.drawHeight,self.drawWidth],np.uint8)

            self.imgScreenData[0:destEndLine] = self.imgWholeData[srcStartLine:srcEndLine]

            self.update()

            destEndLine = destEndLine + step
            srcEndLine = srcEndLine + step

            time.sleep(0.005)
        pass

    def paintEvent(self,event):
        try:
            painter = QPainter()
            destRect = QRect(0,0,self.drawWidth,self.drawHeight)
            srcRect = QRect(0,0,self.drawWidth,self.drawHeight)
            img = QImage(self.imgScreenData.data, self.drawWidth, self.drawHeight, QImage.Format_Indexed8)
            pix = QPixmap.fromImage(img)
            painter.begin(self)
            painter.drawPixmap(destRect, pix, srcRect)
            painter.end()
        except Exception as e:
            print(e)
            raise

        Pass

经验证,图像“拖尾”比较严重,图像滚动平滑效果比不上用DirectX做的效果,但是刷新效率很高,QT这块做的比C#好很多。

下次,实用Opengl做一个,看看效果咋样。

四更山吐月,夜半水明楼。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

纳速健身网成立于2006年8月,是国内优秀健身运动网站,现拥浏览人数超30万。网站是集养生、武术、太极拳和健身气功等多种健身项目于一体的多功能交流平台。平台提供大量优质的教学视频、伴奏音乐(太极拳晨练音乐,广场舞音乐,健身气功音乐)、图文教程、运动科普和经验分享,为健身爱好者提供完善的运动指导平台。
  • 纳速QQ群乙:151815303
  • 纳速QQ群丙:79104490
  • 微信交流群:微信好友搜索【nasuwang】加小纳微信进群交流健身知识,备注【纳速】
  •                     或者扫描页面底部右侧二维码添加小纳微信>>>
  • 微信公众号

  • 微信群客服交流

  • Copyright © 2006-2021, 纳速健身网. | | 辽ICP备13002388号-1 辽公安网备21050202000005号公安网备号 纳速武术-乙 QQ