Esempio n. 1
0
        /// <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();
            }
        }
Esempio n. 2
0
        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
            });
        }
Esempio n. 3
0
        /// <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--;
        }
Esempio n. 4
0
 public StoryCascadePicBuilder(VideoScreenshotConfig videoScreenshotConfig)
 {
     this._videoScreenshot = new VideoScreenshot(videoScreenshotConfig);
     this._picMerger       = new PicMerger();
 }