• Pyqt5 实时图像滚动


    实时图像

    写了一个关于实时图像滚动显示的例子,做个记录。

    滚动算法:

     

    难点:

    将内存数据绘制到界面,需要用到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做一个,看看效果咋样。

  • 相关阅读:
    4.0中的并行计算和多线程详解(一)
    Dojo工具包简介
    javascript中event.keyCode
    iText简介(转)
    ServletContext
    java文件加解密算法
    ResultSet 的相关介绍
    spring的AOP的四种实现方式
    java实现文件zip压缩或者解压缩
    Hibernate查询数据的几种方式以及HQL用法及参数的几种使用方法
  • 原文地址:https://www.cnblogs.com/shelwinnee/p/5482548.html
Copyright © 2020-2023  润新知