纳速健身

标题: Pyqt5 实时图像滚动 [打印本页]

作者: awagink    时间: 2021-1-3 19:55
标题: Pyqt5 实时图像滚动
实时图像
写了一个关于实时图像滚动显示的例子,做个记录。

滚动算法:
(, 下载次数: 0)
难点:
将内存数据绘制到界面,需要用到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做一个,看看效果咋样。

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







欢迎光临 纳速健身 (https://nasue.com/) Powered by Discuz! X3.4