예제 #1
0
        /// <summary>
        /// 在视频播放时并按下暂停按钮,进行视频截图
        /// </summary>
        /// <param name="FileName"></param>
        /// <param name="ImgFormat"></param>
        public Image GetImage()
        {
            Image img = null;

            if (des != null && PlayState == PlayState.Pause)
            {
                img = des.GetImage();
            }
            return(img);
        }
예제 #2
0
        public void Generate()
        {
            Check.Require(Layers, "Layers", Check.NotNull);
            Check.Require(Layers.Count, "Layers.Count", Check.GreaterThan <int>(0));
            Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0));

            ILog _log = LogManager.GetLogger(typeof(IOHelper));

            Layers.Sort(new SortComparer <Layer>("Level", false));
            var DynamicTextDS = Layers.FindAll(item => item.LayerType == LayerType.DynamicText);

            if (Layers.Count == 0)
            {
                //TODO:
                var img = new Bitmap(Layers.VideoSize.Width, Layers.VideoSize.Height);
                using (var g = Graphics.FromImage(img))
                {
                    g.Clear(Layers.BackColor);
                }
                NailImage = img;
                return;
            }

            var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, Layers.VideoSize.Width, Layers.VideoSize.Height, Layers);
            {
                int MaxCount             = Tick <= 0 ? DESConsts.BitCount : (int)Tick * DESConsts.BitCount;
                ManualResetEvent mre     = new ManualResetEvent(false);
                bool             hasSign = false;
                try
                {
                    Control.CheckForIllegalCrossThreadCalls = false;
                    Panel pnl      = new Panel();
                    var   callback = new DESVideoCallBack();

                    EventHandler onCompleted = delegate
                    {
                        if (des != null)
                        {
                            des.Dispose();
                        }
                        Control.CheckForIllegalCrossThreadCalls = true;
                        if (!hasSign)
                        {
                            hasSign = true;
                            mre.Set();
                        }
                    };

                    callback.OnCallBack = () =>
                    {
                        try
                        {
                            if (callback.m_FrameCount == 5)
                            {
                                des.Pause();
                                hasSign = true;
                                mre.Set();
                            }
                        }
                        catch (Exception e)
                        {
                            _log.Error("Generale ThumNail Exception on callBack.", e);
                            _log.Error(e);
                        }
                    };
                    des.Completed += onCompleted;
                    pnl.Width      = Layers.VideoSize.Width;
                    pnl.Height     = Layers.VideoSize.Height;
                    des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(ClientRectangle), 0, Layers.PlayLength);
                    des.StartRendering();
                    des.put_CurrentPosition(Tick);

                    mre.WaitOne();
                    mre.Close();

                    if (des != null && !des.IsDisposed)
                    {
                        NailImage = des.GetImage();
                        des.Cancel();
                    }
                }
                catch (Exception e)
                {
                    _log.Error("Generale ThumNail Exception on general.", e);
                    _log.Error(e);
                    des.Cancel();
                }
            }
        }
예제 #3
0
        public void Generate()
        {
            Check.Require(Layers, "Layers", Check.NotNull);
            Check.Require(Layers.Length, "Layers.Length", Check.GreaterThan <int>(0));
            Check.Require(HWnd, "HWnd", Check.NotNull);
            Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0));

            var layers = helper.PopulateDataBatchLoad(Layers);

            layers.BackColor = HWnd.BackColor;
            //layers.VideoSize = new Size(ControlService.SignCombo.Current.Width, ControlService.SignCombo.Current.Height);
            layers.VideoSize = HWnd.Size;
            layers.Sort(new SortComparer <Layer>("Level", false));
            var DynamicTextDS = layers.FindAll(item => { return(item.LayerType == LayerType.DynamicText); });

            if (layers.Count == 0)
            {
                //TODO:
                var img = new Bitmap(HWnd.Width, HWnd.Height);
                using (var g = Graphics.FromImage(img))
                {
                    g.Clear(HWnd.BackColor);
                }
                NailImage = img;
                return;
            }

            //using (var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, HWnd.Width, HWnd.Height, layers))
            var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, layers.VideoSize.Width, layers.VideoSize.Height, layers);
            {
                int MaxCount             = Tick <= 0 ? DESConsts.BitCount : (int)Tick * DESConsts.BitCount;
                ManualResetEvent mre     = new ManualResetEvent(false);
                bool             hasSign = false;
                try
                {
                    Control.CheckForIllegalCrossThreadCalls = false;
                    Panel pnl      = new Panel();
                    var   callback = new DESVideoCallBack();

                    EventHandler onCompleted = delegate
                    {
                        if (des != null)
                        {
                            des.Dispose();
                        }
                        Control.CheckForIllegalCrossThreadCalls = true;
                        if (!hasSign)
                        {
                            hasSign = true;
                            mre.Set();
                        }
                    };

                    callback.OnCallBack = () =>
                    {
                        try
                        {
                            if (callback.m_FrameCount == 5)
                            {
                                des.Pause();
                                hasSign = true;
                                mre.Set();
                            }
                        }
                        catch
                        {
                        }
                    };
                    des.Completed += onCompleted;
                    pnl.Width      = layers.VideoSize.Width;
                    pnl.Height     = layers.VideoSize.Height;
                    des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(HWnd.ClientRectangle), 0, layers.PlayLength);
                    des.StartRendering();
                    des.put_CurrentPosition(Tick);

                    mre.WaitOne();
                    mre.Close();

                    if (des != null && !des.IsDisposed)
                    {
                        NailImage = des.GetImage();
                        des.Cancel();
                    }
                }
                catch
                {
                    des.Cancel();
                }
            }
        }