/// <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); }
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(); } } }
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(); } } }