/// <summary> /// 预览图合成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> internal void PreviewMerger(object sender, SelectionChangedEventArgs e) { //如果预览图窗口没打开,不需要处理。 if (GlobalScheme.PicturePreviewWindow == null) { return; } var previewMergerList = new List <string>(); foreach (var i in GlobalScheme.GroupDictList.Values.OrderBy(x => x.ID)) { var tempImage = i.MyControl.SelectedItems; if (tempImage == null || tempImage.Count == 0) { continue; } previewMergerList.Add(i.Dict[tempImage[0].ToString()]); } if (previewMergerList.Count != 0) { var outPic = PicMerger.MergerOfStrings(previewMergerList.ToArray()); GlobalScheme.PreviewBS = outPic.GetBitmap(); GlobalScheme.PicturePreviewWindow.RefreshImage(); } }
public void Build(StoryCascadeJobOptions opt) { string windowTempDir = System.Environment.GetEnvironmentVariable("TEMP"); var picList = _videoScreenshot.Screenshot(new ScreenshotJobOptions() { InputFilePath = opt.InputFilePath, OutputDir = windowTempDir, PicCount = opt.PicCount, Width = 300 }); //合并图片 PicMerger picMerger = new PicMerger(); picMerger.Merge(new PicMergeJobOptions() { OutPutPicPath = opt.OutPutPicPath, PicMargin = 5, SourcePicPath = picList, RowCount = 5, DeleteSourcePic = true }); }
/// <summary> /// 列表交叉并合成,不出意外应该是最好的方法 /// </summary> /// <param name="merger_lists">需要处理的文件组的列表</param> /// <param name="needListLen">需要处理的列表数量,主要是内部迭代用。</param> internal void ListXListAndMerge(List <string[]> merger_lists, List <bool?> mustNeedInfoList, int needListLen, ImageOpen inputImage = null) { semaphore.WaitOne(); workingCount++; try { if (needListLen < 1) { //needListLen必定大于等于1,不然就是index超出范围 throw new IndexOutOfRangeException("卧槽怎么做到0个group合成的?"); } if (merger_lists[0].Count() == 0 && GlobalScheme.IsRegexMode) { return; //正则模式下,第一位图片为空就不合成,避免出现奇怪的合成(第二第三合出一个只有头那种) } //如果中间某个列表为空,会造成无法处理后续列表的情况 if (merger_lists[merger_lists.Count - needListLen].Count() == 0) { if (needListLen > 1) { Task.Run(new Action(() => ListXListAndMerge(merger_lists, mustNeedInfoList, needListLen - 1, inputImage))); } else if (inputImage != null && inputImage.MergedCount > 0 && inputImage.SavedSign == 0) { inputImage.Save(); GlobalScheme.MergedCount++; } else { StatusPrint("请输入图片!"); } } //如果这个Grou非必选,要分开原图和合成后图片处理 if (merger_lists[merger_lists.Count - needListLen].Count() != 0 && mustNeedInfoList[merger_lists.Count - needListLen] != true && inputImage != null) { if (needListLen > 1) { Task.Run(new Action(() => ListXListAndMerge(merger_lists, mustNeedInfoList, needListLen - 1, inputImage))); } } foreach (var file in merger_lists[merger_lists.Count - needListLen]) { ImageOpen baseImage; if (inputImage == null) { lock (locker) { //一般第一个组就会变成这种情况,会作为base图片处理 baseImage = new ImageOpen(file); } } else { ImageOpen diffImage; lock (locker) { diffImage = new ImageOpen(file); } //baseImage = inputImage.Clone(); baseImage = PicMerger.Merger(inputImage, diffImage, int.Parse(GlobalScheme.MergerComboSelect), !Scheme.PAChecked); } if (needListLen > 1) { Task.Run(new Action(() => ListXListAndMerge(merger_lists, mustNeedInfoList, needListLen - 1, baseImage))); } else { if (baseImage.MergedCount > 0 && baseImage.SavedSign == 0) { baseImage.Save(); GlobalScheme.MergedCount++; //baseImage.Save(); StatusPrint("已合成" + GlobalScheme.MergedCount.ToString() + "张"); } if (mustNeedInfoList[merger_lists.Count - needListLen] != true && inputImage.MergedCount > 0 && inputImage.SavedSign == 0) { inputImage.Save(); //inputImage.Save(); GlobalScheme.MergedCount++; StatusPrint("已合成" + GlobalScheme.MergedCount.ToString() + "张"); } } //baseImage.Close(); } } catch (Exception ex) { var x = ex.Message; GlobalScheme.MergedErrorCount++; } finally { workingCount--; } semaphore.Release(); //workingCount--; }
public StoryCascadePicBuilder(VideoScreenshotConfig videoScreenshotConfig) { this._videoScreenshot = new VideoScreenshot(videoScreenshotConfig); this._picMerger = new PicMerger(); }