精华内容
下载资源
问答
  • 只要安装一些第三方的库文件并具有一定的几何知识,就可以利用PHP来创建和处理图像了。利用PHP创建动态图像是相当容易的一件事情。下面,笔者将详细介绍如何实现。
  • 在GUI用户界面上绘制实时图像这个问题是在让我头疼了好久,最开始采用... 引入多线程(QT界面涉及到线程安全,是不允许子线程去更改主线界面中的任何控件状态,所以就导致了很多的麻烦)。matplotlib会生成静态后...
    在GUI用户界面上绘制实时图像这个问题是在让我头疼了好久,最开始采用Python中最常用的绘图库matplotlib,在用这个库进行动态绘图时遇到了很多问题。遇到的问题如下:
    1. 动态绘图的图像生成期间会导致界面卡顿 >>>> 引入多线程(QT界面涉及到线程安全,是不允许子线程去更改主线程界面中的任何控件状态,所以就导致了很多的麻烦)。

    2. matplotlib会生成静态图后并不能实时更新 >>>> 使用ion,开启matplotlib的动态绘制模式

    3. 图片在绘制过程中会一条一条往上叠加,不会清除原来的曲线 >>>> 一种方案是将图片的hold性质改成False,但是hold属性在较新版本的matplotlib包里面已经删掉了,想要用要回退到以前的版本;另一种方案是在绘图直线执行以下clear操作。

    4. 虽然设置了图坐标轴名称及其他文字内容,但是图片更新的过程中坐标轴会移动,而且文字会丢失 >>>> 这个应该有解决方法,但是没找到。

    5. 测试每次图片更新间隔时间为0.25s左右,也就是说1秒只能更新四张图片 >>>> 无解,狗带。

    6. 图片更新过程中有时会丢失曲线,丢失曲线后报错都是底层包的“list index out of range” >>>> 好像也是无解的。

    前面一些问题还能忍,找找办法还能解决。第5点是真的不能忍,绘图更新慢就算了,还会拖累其他子线程的运行速度,这个估计是因为Python多线程并非真正意义上的多线程,底层变量还是相同的。也尝试过想用多进程来代替绘图的多线程,但是多进程还涉及到一个共享变量的问题,太难了,写到一半放弃了。这个动态绘图前前后后折磨了我一个多月,最后受不来了,推倒重写。重写主要有两个方面:
    • 一个是将原本使用的Python自带多线程Thread替换成QT框架下的QThread,通过信号与槽这样一个机制来向界面主线程发送信息更改界面内容;

    • 另一个是用pyqtgraph库来进行动态绘图,pyqtgraph库是专门用于Qt GUI界面上的图像绘制,主打的就是轻量级的特点。虽然这个库的可参考资料实在不多,很多特性更改都是啃文档和摸索实现的,但是结果是真香!!!!

    接下来将matplotlib库和pyqtgraph库写的代码贴出来解释一下,然后再附上每一种的实现效果动图

    1. matplotlib实现PyQt界面上的动态绘图

    matplotlib动态绘图代码主要分为三个部分:初始化更新函数图像绘制

    1.1 界面开启时候的初始化设置

    1#画图函数的初始设置
    2def drawing_init(self):
    3    self.layout = QHBoxLayout(self.label)
    4    self.mpl = PlotCanvas(self, width=3, height=9)  # 实例化一个画布对象
    5    #创建每一幅图的绘图数据
    6    self.move_val1 = [0] * 50
    7    self.move_val2 = [0] * 50
    8    self.move_val3 = [0] * 50
    9    self.move_val4 = [0] * 50

    1.2 动态图像初始化及更新函数

     1#绘图线程
    2class PlotCanvas(FigureCanvas):
    3    def __init__(self, parent=None, width=5, height=4, dpi=100):
    4        # 配置中文显示
    5        plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
    6        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    7        self.fig = plt.figure(figsize=(width, height), dpi=dpi)
    8        self.font1 = {'family''KaiTi',
    9                      'weight''normal',
    10                      'size'13,
    11                      }
    12        self.axe1 = self.fig.add_subplot(411)
    13        # self.axe1.hold(False)
    14        self.axe1.set_xlabel("发动机1", self.font1)
    15        self.axe1.set_xticks([])
    16        self.axe1.set_ylabel("运动情况", self.font1)
    17        self.axe1.set_yticks([])
    18        plt.subplots_adjust(left=0.1, top=0.99, right=0.99, bottom=0.03, wspace=0, hspace=0.15)
    19        self.axe2 = self.fig.add_subplot(412, xlim=(050), ylim=(-1010))
    20        # self.axe2.hold(False)
    21        self.axe2.set_xlabel("发动机2", self.font1)
    22        self.axe2.set_xticks([])
    23        self.axe2.set_ylabel("运动情况", self.font1)
    24        self.axe2.set_yticks([])
    25        self.axe3 = self.fig.add_subplot(413, xlim=(050), ylim=(-1010))
    26        # self.axe3.hold(False)
    27        self.axe3.set_xlabel("发动机3", self.font1)
    28        self.axe3.set_xticks([])
    29        self.axe3.set_ylabel("运动情况", self.font1)
    30        self.axe3.set_yticks([])
    31        self.axe4 = self.fig.add_subplot(414, xlim=(050), ylim=(-1010))
    32        # self.axe4.hold(False)
    33        self.axe4.set_xlabel("发动机4", self.font1)
    34        self.axe4.set_xticks([])
    35        self.axe4.set_ylabel("运动情况", self.font1)
    36        self.axe4.set_yticks([])
    37        FigureCanvas.__init__(self, self.fig)
    38        self.setParent(parent)
    39        #定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间
    40        FigureCanvas.setSizePolicy(self,
    41                                   QSizePolicy.Expanding,
    42                                   QSizePolicy.Expanding)
    43        FigureCanvas.updateGeometry(self) 
    44
    45    def drawing(self,move_val1,move_val2,move_val3,move_val4):
    46        self.axe1.clear()
    47        self.axe2.clear()
    48        self.axe3.clear()
    49        self.axe4.clear()
    50        plt.ion()
    51        self.axe1.plot(move_val1)
    52        self.axe2.plot(move_val2)
    53        self.axe3.plot(move_val3)
    54        self.axe4.plot(move_val4)

    这里函数里面给出了matplotlib绘图基础设置的一些代码,有文字正常显示、字体、多个图像组成一幅图、尺寸设置等。在drawing函数中,50行的plt.ion()开启了动态绘图。

    1.3 图像绘制

     1#更改绘图数据
    2del self.move_val1[0]
    3del self.move_val2[0]
    4del self.move_val3[0]
    5del self.move_val4[0]
    6self.move_val1.append(img_val[0])
    7self.move_val2.append(img_val[1])
    8self.move_val3.append(img_val[2])
    9self.move_val4.append(img_val[3])
    10#每次绘制之前布局中移除原本图像,再添加新的图像
    11self.layout.removeWidget(self.mpl)
    12self.mpl.drawing(self.move_val1, self.move_val2, self.move_val3, self.move_val4)
    13self.layout.addWidget(self.mpl)
    效果如下:

    59115368d22bfc5b6e030ffe103f87d8.gif 

    可以看出图像更新有些卡顿,而且有时候图像会没有曲线,还有坐标轴是真的丑。

    2. pyqtgraph实现PyQt界面上的动态绘图2.1 绘图函数初始化
     1#画图功能画布初始化
    2def drawing_init(self):
    3    self.move_val_list = [[], [], [], []]
    4    self.data_val_list = [[], [], [], []]
    5
    6    self.pen1 = QPen(QColor(110242255))  #Qpen的画笔
    7    self.pen1.setWidth(0.03)
    8    self.pen1.setStyle(Qt.SolidLine)
    9    self.pen2 = QPen(QColor(207155255))
    10    self.pen2.setWidth(0.03)
    11    self.pen2.setStyle(Qt.SolidLine)
    12    self.pen3 = pg.mkPen({'color': (110242255), 'width'2})  #mkPen的画笔
    13    self.pen4 = pg.mkPen({'color': (207155255), 'width'2})
    14    pg.setConfigOption('background', (1564123))  #设置背景色
    15    pg.setConfigOption('foreground', (148209224))  #设置坐标轴颜色
    16    self.plot_layout1 = QGridLayout(self.drawlabel1)  #创建网格Layout
    17    self.plot_plt1 = pg.PlotWidget()  #初始化绘图板
    18    self.plot_plt1.setYRange(max=-1.3, min=1.3)  #设置纵坐标区域
    19    self.plot_layout1.addWidget(self.plot_plt1)  #将绘图板置于布局中
    20    # self.plot_plt1.setLabel('bottom', "开始运动时间", units='s')
    21    # pltItem = self.plot_plt1.getPlotItem()
    22    self.plot_plt1.showGrid(x=True, y=True, alpha=0.8)  #设置网格及其透明度
    23    self.plot_plt1.setMouseEnabled(x=True, y=False)  #设置能够通过鼠标滚轮或者拖动图片
    24    self.plot_moveval1 = self.plot_plt1.plot(pen=self.pen3)  #设置绘图曲线1画笔
    25    self.plot_dataval1 = self.plot_plt1.plot(pen=self.pen4)  #设置绘图曲线2画笔

    解释点:

    1. 第6行和第12行设置了Qpenmkpen两种绘图画笔,感觉还是mkpen好用一些。Qpen线宽较大时,感觉就是一个一个点组成的,视觉效果不行。
    2. 第14行和15行中设置了图的背景色坐标轴颜色,一般界面风格统一,多幅图都是统一背景色,后续图像便不需再设置这一特性,只要将上面关于plot_plt1的设置重新写一份就行了

    2.2 图像更新

    1try:
    2    self.plot_moveval1.setData(move_x_val, graph_move_val_list[0])
    3    self.plot_dataval1.setData(data_x_val, graph_data_val_list[0])
    4except Exception:
    5    pass
    解释点:
    1. setData就能更新图像,setData的机制应该是只重绘新的数据点,且更新对象是曲线,因此不会存在上一条曲线仍然留在图像中的问题。

    2. 经过测试图像更新一次时间在10ms以下,比起matplotlib动态图的250ms性能提升很多

    3. 尽量将绘图数据更新置于其他线程,以提高绘图速度。数据的更新与绘图时数据的获取可以考虑采取一个线程锁,保护数据的一致性。为了线程安全,设置了一个子线程每隔一秒钟发射信号让绘图函数执行一次。

    4. 这里用了try....except的异常机制是因为x轴的数据是通过np.arrange对一个区间进行均分的,在少数情况下x轴数据与y轴数据会差1个,这时候就会报错。因此引入异常机制,如果位数不等这次图像更新就不执行了,等待下一秒一起更新。

    效果:

    8b676a7ff3d9d8bd8b8352d947d0eb67.gif

    pyqtgraph好用的地方在于轻量级,而且内嵌了鼠标事件,左下角还有一个A的按钮,可以让图像回到最适合的大小。右键图片还自带图片保存,鼠标事件设置等。缺点就是资料比较少,主要资料有:
    • pyqtgraph中文文档:https://blog.csdn.net/Eppley/article/details/82999998?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

    • 官方文档:https://pyqtgraph.readthedocs.io/en/latest/index.html

    • 大佬教程:https://zmister.com/archives/category/data-apply/pyqtgtaph-tutorial/

    展开全文
  • 下面,笔者将详细介绍如何实现。  在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。...
    只要安装一些第三方的库文件并具有一定的几何知识,就可以利用PHP来创建和处理图像了。利用PHP创建动态图像是相当容易的一件事情。下面,笔者将详细介绍如何实现。
      在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。
      在建立图像创建环境之前,还需要做一些准备工作。首先,安装t1lib接着安装jpeg-6b,然后再安装GD库文件。在安装时一定要按这里给定的顺序进行安装,因为在编译GD入库时会用到jpeg-6b,如果没有安装jpeg-6b,在编译时就会出错。
      在安装完这三个组件后,还需要重新配置一次PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一。运行make clean,然后在当前的配置中添加下面的内容:
      --with-gd=[/path/to/gd]
      --with-jpeg-dir=[/path/to/jpeg-6b]
      --with-t1lib=[/path/to/t1lib]
      完成添加后执行make命令,然后再执行make install命令,重新启动Apache后运行phpinfo()来检查一下新的设置是否生效了。现在,我们就可以开始图像创建工作了。
      根据所安装的GD库文件的版本将决定你是否能创建GIF或PNG格式的图形文件。如果安装的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能创建PNG格式,如果安装的是gd-1.6以后的版本,可以创建PNG文件但不能创建GIF格式的文件。
      创建一幅简单的图像也需要用到许多的函数,我们将一步一步地进行说明。
      在下面的例子中,我们将创建一个PNG格式的图像文件,下面的代码是一个包含所创建的图像的MIME类型的头部:
      <? header ("Content-type: p_w_picpath/png");
      使用ImageCreate()创建一个代表空白图像的变量,这个函数要求以像素为单位的图像大小的参数,其格式是ImageCreate(x_size, y_size)。如果要创建一个大小为250×250的图像,就可以使用下面的语句:
      $newImg = ImageCreate(250,250);
      由于图像还是空白的,因此你可能会希望用一些彩色来填充它。你需要首先使用ImageColorAllocate()函数用其RGB值为这种颜色指定一个名字,这一函数的格式为ImageColorAllocate([p_w_picpath], [red], [green], [blue])。如果要定义天蓝色,可以使用如下的语句:
      $skyblue = ImageColorAllocate($newImg,136,193,255);
      接下来,需要使用ImageFill()函数用这种颜色填充这个图像,ImageFill()函数有几个版本,例如ImageFillRectangle()、ImageFillPolygon()等。为简单起见,我们通过如下的格式使用ImageFill()函数:
      ImageFill([p_w_picpath], [start x point], [start y point], [color])
      ImageFill($newImg,0,0,$skyblue);
      最后,在图像建立后释放图像句柄和所占用的内存:
      ImagePNG($newImg);
      ImageDestroy($newImg); ?>
      这样,创建图像的全部代码如下所示:
      <? header ("Content-type: p_w_picpath/png");
      $newImg = ImageCreate(250,250);
      $skyblue = ImageColorAllocate($newImg,136,193,255);
      ImageFill($newImg,0,0,$skyblue);
      ImagePNG($newImg);
      ImageDestroy($newImg);
      ?>
      如果把这个脚本文件保存为skyblue.php,并用浏览器访问它,我们会看到一个天蓝色的250×250的PNG格式的图像。
      我们还可以使用图像创建函数对图像进行处理,例如把一个较大图像作成一个小图像:
      假设你有一幅图像,想从中裁剪出一个35×35大小的图像。你所需要作的是创建一个35×35大小的空白图像,创建一个包含原来图像的图像流,然后把一个经过调整大小的原来的图像放到新的空白图像中。
      要完成这一任务的关键函数是ImageCopyResized(),它要求的格式如下所示:ImageCopyResized([new p_w_picpath handle],[original p_w_picpath handle],[new p_w_picpath X], [new Image Y], [original p_w_picpath X], [original p_w_picpath Y], [new p_w_picpath X], [new p_w_picpath Y], [original p_w_picpath X], [original p_w_picpath Y])。
      <? /*发送一个头部,以便让浏览器知道该文件所包含的内容类型*/
      header("Content-type: p_w_picpath/png");
      /*建立保存新图像高度和宽度的变量*/
      $newWidth = 35;
      $newHeight = 35;
      /*建立给定高度和宽度的新的空白图像*/
      $newImg = ImageCreate($newWidth,$newHeight);
      /*从原来较大的图像中得到数据*/
      $origImg = ImageCreateFromPNG("test.png");
      /*拷贝调整大小后的图像,使用ImageSX()、ImageSY()得到原来的图像在X、Y方面上的大小*/
      ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg));
      /*创建希望得到的图像,释放内存*/
      ImagePNG($newImg);
      ImageDestroy($newImg); ?>
      如果把这一小段脚本保存为resized.php,然后用浏览器对它进行访问,就会看到一个35×35大小的PNG格式的图像。

    转载于:https://blog.51cto.com/menory/9190

    展开全文
  • 工厂里面有好多货架,小推车在货架之间运动 现在需要用delphi写一个式,显示小推车的运动路线 谁有写过类似的,指导下 有什么可用的控件或算法么
  • //此时已在主线中,更新UI mTv.setText("我又更新了"); } }); 第三种: Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(new Runnable() { @Override public void ...

    第一种:

    mTv.post(new Runnable() {
            @Override
            public void run() {
                mTv.setText("更新textView");
            }
        });

    第二种:

    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //此时已在主线程中,更新UI
                    mTv.setText("我又更新了");
                }
            });

    第三种:

    Handler mainHandler = new Handler(Looper.getMainLooper());
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                mTv.setText("我又又更新了");
            }
        });

    ImageView动态设置图片注意点:
    mIv.setBackgroundResource(R.drawable.***);
    这样设置会图片会拉伸,并且如果xml布局这个控件有预先的图片,不能够覆盖预先的图片


    mIv.setImageDrawable(getResources().getDrawable(R.drawable.***));
    这样会替换xml中该控件预先的图片并且图片不会被拉伸。

    mIv.setBackgroundResource(R.drawable.***);

    这是设置图片的背景的

     

     

    展开全文
  • 这一类应用式在技术上要求不高,但制作起来起来却很花时间,这时便可使用今次介绍的VideoKiosk。 VideoKiosk是一个可在Linux和Windows上执行的开源式,操作原理非常简单,就是用户只要在作为按键的图像上...

    博物馆等展览品前面,都会有一个显示屏,访客按一下画面上的键就会播放相关动画和资料。 这一类应用程式在技术上要求不高,但制作起来起来却很花时间,这时便可使用今次介绍的VideoKiosk。


    VideoKiosk是一个可在Linux和Windows上执行的开源程式,操作原理非常简单,就是用户只要在作为按键的图像上点击,系统便会自动播放动画,动画播放采用MPlayer,并支援多种动画格式。 一般附有显示屏的内嵌式展示台(Kiosk)因为成本上的考虑,作业系统采用的都是Linux,再配合轻触式屏幕,在各种公共施设和学校都将大派用场。 VideoKiosk可从Google Code的网站下载

    via{Linuxpilot}

    原创文章如转载请注明:转自Ubuntu之家 {www.ubuntuhome.com}

    本文地址:制作播放动画程式的VideoKiosk

    转载于:https://blog.51cto.com/yaodh07/405368

    展开全文
  • Android 动态关系

    2019-09-04 10:22:56
    3、简单说一下思路,自定义View ,继承SurfaceView,这种设计不会影响主线的操作,surfaceView拥有独立的Cavans,绘制效率高,动画效果流畅。 4、开始上代码 第一步,画圆,这个简单,需要的是外部传入节点的...
  • 构建动态柱形,官方的API并没有提供可以借鉴的动态更新饼图的方法,考虑到数据都是活动的,不可能总是用静态数据,具体是通过定时器+Handler实现定时任务,通过Handler更新主线UI,在更新之前要把之前的数据清除...
  • 动态连接式库

    2012-05-25 19:03:02
    首先见: 动态链接库(Dynamic Link Library或者Dynamic-link library,缩写为DLL),又称为动态链接库,是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。 定义  程序编制一般...
  • 图形、图像与动画2

    2019-09-24 00:48:36
    三 动画 ...1)Core Animation 动画在单独的线程中完成,不会阻塞主线; 2)Core Animation 动画只会重绘界面上变化的部分(局部刷新); ➡️ CAAnimation:所有动画的基类,实现了CAMediaTimi...
  • 核心动画类关系

    2015-02-07 10:29:00
    核心动画是基于CALayer的操作,在后台操作不阻塞主线 以下是核心动画的类关系 转载于:https://www.cnblogs.com/lijianyi/p/4278458.html
  • 动态磁贴是什么,相信大家用了这么久的Windows 8/8.1/10早就非常了解了吧。像什么小磁贴、中磁贴、宽磁贴、大磁贴,还有这里的应用商店Logo等,大家在下面根据不同的分辨率选择合适的图片就好啦。...
  • 构建动态柱形,官方的API并没有提供可以借鉴的动态柱形的方法,考虑到数据都是活动的,不可能总是用静态数据,具体是通过定时器+Handler实现定时任务,通过Handler更新主线UI,在更新之前要把之前的数据清除掉...
  • 图书分拣装置的设计及运动仿真,昭竣,禇达,根据图书馆的实际情况,本文设计适用于图书馆的高效图书分拣系统。本文介绍了该系统的整体设计思路,根据功能的需求对部分重点结
  • 最重要的就是加载完成图片之后在子线添加Marker操作 网上说的通过view转成bitmap感觉没什么用 代码如下:代码如下: Glide.with(mContext).load(mjbBean.getPicUrl()).into(new SimpleTarget() { @Override ...
  • 题记:写这篇博客要主是加深自己对动画图片的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。 闲暇之余,和大家讲讲cocos2d-x 创立帧...且这个plist里头包含了多个帧动画息信,然后我们再到...
  • 测量实验中,利用飞行高度为35 km的平流层气球搭载的碘钨灯作为光源,实时测量了斜传输路径上的大气相干长度值。与此同时,在距离新仪器5 m处放置了一台以太阳的边缘作为光源、测量整层大气相干长度的大气相干长度...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请...所以我们要把城市的经纬度信息找出来,如果城市比较少可以手动搜索填写,如果城市比较多的话可以做个小爬虫...
  • 微信运动刷步appv6.6 类型:便捷生活 大小:45.21MB 评分:7.7 平台: 标签:生活服务运动健身减肥效率 立即下载  微信运动刷步是为了提供用户在微信运动排行榜...
  • 前言:SmartProject 项目是C#桌面程序的精简版,很多属性和事件可能都没有设置进SDK中。在最近的PDA程序中,我没用使用进度条。... 原理:开启线程切换图片实现显示(子线不影响主线而继续往下执行)。
  • 矢Axure夜话:中继器系列视频教程之中继器表格分页动态页数 案例描述:使用中继器表格分页动态生成页码 知识点: 中继器的分页中继器新增中继器删除 效果: 本站在线效果预览:...
  • SurfaceView在绘制图形方面有什么特点呢,我们都知道,在Android中,图形view交互都是通过主线来完成的,这样在游戏、应用等多图形交互的时候会发生主线阻塞,形成卡顿现象。而SurfaceView则是通过另外一个线程...
  • 矢Axure夜话:Axure基础系列视频教程之图片手动播放 案例描述:图片手动播放 知识点: 动态面板事件属性 效果:   本站在线效果预览:...
  • 但是在大学生涯写期末大作业或者实训写一个项目时,我们往往还没有接触过除了控制台以外的其它窗口的便实现,但我们有时需要得到有图像的程序,甚至让图像能动起来。这个时候我们会想到自然就是通过利用输出符号来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 780
精华内容 312
关键字:

动程图