前言
      视频监控的分屏技术实际上就是通过动态Panel + 动态指定其Location和Size来实现的,还需要一个计算分屏数目的算法,本文将弥补视频监控系列中动态分屏的功能,权当续文吧 : )

正文
      1.      先“上菜”再讲做法:——上图~~

2.      动态Panel

        /// <summary>
        /// 动态创建面板
         /// </summary>
        /// <param name="xy">Panel的XY坐标</param>
        /// <param name="wh">Panel的大小</param>
        private Panel CreatePanel(Point xy, Size wh)
        {
            Panel panel = new Panel();
            panel.BackColor = System.Drawing.Color.Transparent;
            panel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
            panel.Location = xy;
            panel.Name = string.Concat("pVideo");
            panel.Size = wh;
            panel.TabIndex = 0;
            panel.BackColor = Color.Black;
            return panel;
        }

3.      分屏算法

        /// <summary>
        /// 根据通道数动态计算Panel的坐标和大小
        /// </summary>
        /// <param name="channelCount">通道数</param>
        /// <param name="xy">返回运算后每个Panel的坐标</param>
        /// <param name="wh">返回运算后每个Panel的大小</param>
        private void MathDynamicPanel(int channelCount, out Point[] xy, out Size[] wh)
        {
            xy = new Point[channelCount];
            wh = new Size[channelCount];

//第一个Panel的起始坐标——不变
            xy[0] = new Point(2, 38);

//模数
            int modulo;

if (channelCount <= 4)
                modulo = 2;
            else if (channelCount <= 9)
                modulo = 3;
            else if (channelCount <= 16)
                modulo = 4;
            else if (channelCount <= 25)
                modulo = 5;
            else if (channelCount <= 36)
                modulo = 6;
            else if (channelCount <= 49)
                modulo = 7;
            else// if (channelCount <= 64)
                modulo = 8;

int width, height;
            //610 为整个预览区的宽
            width = (610 - modulo * 1) / modulo;
            //532 为整个预览区的高
            height = (532 - modulo * 1) / modulo;

for (int i = 0; i < channelCount; i++)
            {
                wh[i] = new Size(width, height);
                if (i > 0)
                {
                    //同一行的Y坐标相等
                    //同一列的X坐标相等
                    if (i % modulo == 0)
                        xy[i] = new Point(xy[i - modulo].X, xy[i - modulo].Y + height + 1);
                    else
                        xy[i] = new Point(xy[i - 1].X + width + 1, xy[i - 1].Y);
                }
            }
        }

代码说明:
                  a).      采用平方算法,即4个头4个Panel(2 ^ 2),8个头9个Panel(3 ^ 3),算是比较简单也满足基本需求的算法了。
                  b).      注意需要固定左上角顶点坐标和总面积,即(2,38)和610,532,这个可以根据自己的时间情况加以修改,可以定义成const int 就行。
                  c).      注意里面算坐标的时候有+1,这个是Panel之间的间隙。
      4.      使用例子
        在Form_Load中加入如下代码:

            Point[] xy;
            Size[] wh;
            int channel = 8;
            //计算面板坐标
            MathDynamicPanel(channel, out xy, out wh);
            //创建面板
            for (int i = 0; i < channel; i++)
            {
                this.Controls.Add(CreatePanel(xy[i], wh[i]));
            }

运行即可见到截图中的样子,最大支持64个屏幕,满足基本需求,自己加上放大、缩小和全屏的代码功能就比较完整了。

  5.文章更新维护

    5.1  2010-5-22  修改一下方法,更加好用点

        /// <summary>
        /// 计算视频面板位置和面积
        /// </summary>
        /// <param name="channelCount"></param>
        /// <param name="TotalSquare">总面积和坐标</param>
        /// <returns></returns>
        private IList<Rectangle> CalcPanelRectangle(int channelCount, Size TotalArea)
        {
            IList<Rectangle> result = new List<Rectangle>();

//模数
            int modulo;
            if (channelCount <= 4)
                modulo = 2;
            else if (channelCount > 64)
                modulo = 8;
            else
                modulo = (int)Math.Ceiling(Math.Sqrt(channelCount));         //平方根

int width, height;

//单个画面大小
            width = (TotalArea.Width - modulo * 1) / modulo;
            height = (TotalArea.Height - modulo * 1) / modulo;

for (int i = 0; i < channelCount; i++)
            {
                Rectangle rect = new Rectangle();
                rect.Width = width;
                rect.Height = height;
                if (i % modulo == 0)
                {
                    rect.X = 1;
                    if (i == 0)
                        rect.Y = 1;
                    else
                        rect.Y = result[i - modulo].Y + height + 1;
                }
                else
                {
                    rect.X = result[i - 1].X + width + 1;
                    rect.Y = result[i - 1].Y;
                }
                result.Add(rect);
            }
            return result;
        }

  

    5.2  示例代码  2010-5-25

      分屏示例下载

结束语
      这个功能也是在最近代码重构的时候补上来的,也欢迎大家提供其他算法来分屏 :)

转载于:https://blog.51cto.com/over140/584179

WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]相关推荐

  1. 网页无插件播放265/264视频/监控大屏/GPU解码

    网页无插件播放265/264视频/监控大屏/GPU解码 先看效果 特点 GPU解码,chrome网页播放32路 h256/hevc 直播视频流,毫无压力. 提供1分屏.4分屏.8分屏.9分屏.16分屏 ...

  2. java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发

    最近在搞视频监控项目,需要在网页上显示实时视频,于是网上找了很多资料研究如何在网页上播放视频,一种实现方式就是开发activex控件嵌入到网页中. 如下我将介绍如何开发一个可以分屏播放视频的activ ...

  3. 视频监控分屏简单例子

    第一次入住园子,第一次写博客好紧张:) 最近在做关于一个视频监控的项目涉及到分屏显示功能.下载了几个网上的例子看下都不是太符合要求,所以只能自己动手改造一下 首先定义好要分屏样式的数组: //X,Y, ...

  4. 超分论文笔记2020CVPR视频超分:Zooming Slow-Mo- VSR with Temporal Group Attention-TDAN

    Space-Time Video Super-Resolution (STVSR) 问题定义: 从一个低像素低帧率恢复出高帧率高分辨率的视频. 1.Zooming Slow-Mo: Fast and ...

  5. 字节跳动 录屏功能_视频激励-录屏分享参考规范

    背景 [视频录制及分享]是字节跳动系平台独有的也是最核心的内容展示能力及产品分发能力.我们希望通过平台提供的视频相关 api 接口能力,能让小游戏发行和平台能力充分结合,更好的利用,帮助小游戏在本平台 ...

  6. Qt_实现视频监控分屏效果的思想(1,4,6,9,16屏)

    ** 一.运行效果图示: ** ** 二.代码如下(基于Qt5.9.9编译运行) ** #include "widget.h" #include "ui_widget.h ...

  7. EasyCVR如何实现视频监控的大屏播放?

    在我们碰到的很多安防监控系统项目中,用户除了要求要将视频统一接入并且分级管理之外,还要求视频能够上墙或者进行大屏播放.针对这种需求,我们也可以借助Ehome或者GB28181协议的特点来实现,Ehom ...

  8. 【解决方案】5G时代浪潮来袭,EasyNVR助力5G厂区视频监控安防采集可视化展示

    智慧工厂被认为是5G技术的重要应用场景之一,利用5G网络将生产设备无缝连接,并进一步打通设计.采购.仓储.物流等环节,满足工业环境下设备互联和远程交互应用需求.TSINGSEE青犀视频面向工厂智能化升 ...

  9. Android 播放视频时横竖屏的调整

    我个人看视频的时候喜欢横屏看,这样视频图像显得还大,所以在做自己的播放器的时候默认就是横屏显示.这样在播放横屏录制的视频时没有问题,但是一旦播放竖屏录制的视频问题就大了,图像都是偏转90度的.这可怎么 ...

  10. C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结

    前言 本章主要把可能用到的C# WinForm 功能性代码在这里汇总一下,以备实现其他功能来满足客户的其他需求,或者方便自己开发. 注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代 ...

最新文章

  1. 设计模式C++实现(7)——外观模式、组合模式
  2. Java垃圾回收总结
  3. OS- -文件系统(四)
  4. 部署Spring Boot Angular App(Maven和Tomcat)的4种方法
  5. ubuntu小企鹅输fcitx入法乱码问题
  6. OpenGL(一)——OpenGL入门
  7. 力扣-118 杨辉三角
  8. java递归算法详解_Java递归算法详解(动力节点整理)
  9. Linux下通过ssh上传、下载文件或者文件夹
  10. 常见笔顺错误的字_易错汉字笔画顺序 你全都会吗?
  11. PHP从入门到精通 第二版pdf
  12. IntelliJ IDEA 2020 提示“Unmapped Spring configuration files found.Please configure Spring facet.”解决办法
  13. 芝诺数解|「七」月是故乡明,月饼表浓情
  14. unity如何插入图片_Unity3D教程:导入贴图和模型
  15. STM32物联网套件基础版03-控制继电器
  16. Intel Me更新
  17. [业务知识] 深入了解医联体和医共体
  18. IU酒店释放轻中端投资活力,开启曲靖酒店新篇章
  19. USB 3.0硬件设计
  20. 线性回归预时间序列预测

热门文章

  1. tensorflow学习笔记(1):使用入门
  2. jsp java ldquo_添加jsp · yayaangel/java201521123103 - Gitee.com
  3. cad统计多线段总长度插件_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
  4. 庖丁解牛之spring源码系列一
  5. 使用手机访问 Office 文档
  6. bzoj4407: 于神之怒加强版
  7. MySQL - 字段名的修饰
  8. 画图解释 SQL join 语句
  9. C#委托之个人理解(转)
  10. 标 题: 三维游戏里面的自动寻路的算法可能是什么样的?