示例#1
0
 protected void OnImageProcessed(ImageProcessedEventArgs args)
 {
     if (ImageProcessed != null)
     {
         ImageProcessed(args);
     }
 }
示例#2
0
        private void ProcessImage(object threadIndex)
        {
            int index = (int)threadIndex;

            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " is created to process indexed item [" + index + "] at " + DateTime.Now + ".");
            Trace.WriteLine("Current Thread " + Thread.CurrentThread.ManagedThreadId + " Culture " + Thread.CurrentThread.CurrentCulture.ToString() + " during processing.");

            string imagePath  = string.Empty;
            uint   imageIndex = 0;

            lock (syncRoot) {
                if (jobQueue.Count > 0)
                {
                    JobItem item = jobQueue.Dequeue();

                    imagePath  = item.FileName;
                    imageIndex = item.Index;
                    Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " is handling " + imagePath);
                }
                else
                {
                    // nothing more to process, signal
#if DEBUG
                    Debug.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " is set because no more image to process at " + DateTime.Now + ".");
#endif
                    events[index].Set();
                    return;
                }
            }

            if (stopFlag)
            {
                // stop requested, signal
#if DEBUG
                Debug.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " is set because stop requested.");
#endif
                events[index].Set();
                return;
            }
            else
            {
                ExifMetadata exif = null;

                Image normalImage = null;
                Image thumbImage  = null;
                try {
                    if (ps.KeepExif)
                    {
                        // keep exif information from original file
                        exif = new ExifMetadata(new Uri(imagePath), true);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " obtained EXIF for " + imagePath + " at " + DateTime.Now + ".");
                    }

                    // this will lock image until entire application quits: normalImage = Image.FromFile(imagePath);
                    // following code won't lock image.
                    using (Stream stream = File.OpenRead(imagePath)) {
                        normalImage = Image.FromStream(stream);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " opened " + imagePath + " at " + DateTime.Now + ".");
                    }

                    ImageFormat format = getImageFormat(imagePath);

                    IProcess process;

                    // thumbnail operation
                    if (ps.ThumbnailSetting.GenerateThumbnail && ps.ThumbnailSetting.ThumbnailSize > 0)
                    {
                        process    = container.Resolve <IProcess>("ThumbImage");
                        thumbImage = process.ProcessImage(normalImage, this.ps);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " processed thumbnail for " + imagePath + " at " + DateTime.Now + ".");
                    }

                    // shrink image operation
                    if (ps.ShrinkImage && ps.ShrinkPixelTo > 0)
                    {
                        process     = container.Resolve <IProcess>("ShrinkImage");
                        normalImage = process.ProcessImage(normalImage, this.ps);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " shrinked " + imagePath + " at " + DateTime.Now + ".");
                    }

                    // image process effect
                    if (ps.ProcessType != ImageProcessType.None)
                    {
                        switch (ps.ProcessType)
                        {
                        case ImageProcessType.GrayScale:
                            process     = container.Resolve <IProcess>("GrayscaleEffect");
                            normalImage = process.ProcessImage(normalImage, null);
                            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied GrayscaleEffect for " + imagePath + " at " + DateTime.Now + ".");
                            break;

                        case ImageProcessType.NagativeImage:
                            process     = container.Resolve <IProcess>("NegativeEffect");
                            normalImage = process.ProcessImage(normalImage, null);
                            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied NegativeEffect for " + imagePath + " at " + DateTime.Now + ".");
                            break;

                        case ImageProcessType.OilPaint:
                            process     = container.Resolve <IProcess>("OilPaintEffect");
                            normalImage = process.ProcessImage(normalImage, null);
                            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied OilPaintEffect for " + imagePath + " at " + DateTime.Now + ".");
                            break;

                        case ImageProcessType.PencilSketch:
                            process     = container.Resolve <IProcess>("PencilSketchEffect");
                            normalImage = process.ProcessImage(normalImage, null);
                            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied PencilSketchEffect for " + imagePath + " at " + DateTime.Now + ".");
                            break;

                        case ImageProcessType.Relief:
                            process     = container.Resolve <IProcess>("ReliefEffect");
                            normalImage = process.ProcessImage(normalImage, null);
                            Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied ReliefEffect for " + imagePath + " at " + DateTime.Now + ".");
                            break;

                        default:
                            break;
                        }
                    }

                    if (ps.WatermarkCollection != null && ps.WatermarkCollection.Count > 0)
                    {
                        IUnityContainer watermarkContainer;
                        watermarkContainer = container.CreateChildContainer();
                        watermarkContainer.RegisterInstance <List <ExifContainerItem> >(exifContainer)
                        .RegisterInstance <string>(dateTimeStringFormat);

                        for (int watermarkIndex = 0; watermarkIndex < ps.WatermarkCollection.Count; watermarkIndex++)
                        {
                            watermarkContainer.RegisterInstance <int>(watermarkIndex);

                            if (ps.WatermarkCollection[watermarkIndex] is WatermarkText)
                            {
                                // text watermark operation
                                WatermarkText wt = ps.WatermarkCollection[watermarkIndex] as WatermarkText;
                                if (!string.IsNullOrEmpty(wt.Text) && wt.WatermarkTextColor.A > 0)
                                {
#if DEBUG
                                    Debug.WriteLine("Current Thread "
                                                    + Thread.CurrentThread.ManagedThreadId + " Culture "
                                                    + Thread.CurrentThread.CurrentCulture.ToString()
                                                    + " before ApplyWatermarkText.");

                                    Debug.WriteLine("Current Thread: "
                                                    + Thread.CurrentThread.ManagedThreadId + ";"
                                                    + " Image File Name: " + imagePath + ","
                                                    + " Watermark Text index: " + watermarkIndex
                                                    + " before.");
#endif
                                    //process = container.Resolve<IProcess>("WatermarkText");
                                    process = watermarkContainer.Resolve <IProcess>("WatermarkText");
                                    process.ImageFileName = imagePath;
                                    normalImage           = process.ProcessImage(normalImage, this.ps);
                                }
                            }
                            else if (ps.WatermarkCollection[watermarkIndex] is WatermarkImage)
                            {
                                // image watermark operation
                                WatermarkImage wi = ps.WatermarkCollection[watermarkIndex] as WatermarkImage;
                                if (!string.IsNullOrEmpty(wi.WatermarkImageFile) &&
                                    File.Exists(wi.WatermarkImageFile) &&
                                    wi.WatermarkImageOpacity > 0)
                                {
#if DEBUG
                                    System.Diagnostics.Debug.WriteLine("Current Thread: "
                                                                       + System.Threading.Thread.CurrentThread.ManagedThreadId + ";"
                                                                       + " Image File Name: " + imagePath + ","
                                                                       + " Watermark Image index: " + watermarkIndex
                                                                       + " before.");
#endif
                                    process = watermarkContainer.Resolve <IProcess>("WatermarkImage");
                                    process.ImageFileName = imagePath;
                                    normalImage           = process.ProcessImage(normalImage, this.ps);
                                }
                            }
                        }

                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " applied watermark(s) for " + imagePath + " at " + DateTime.Now + ".");
                    }

                    // border operation
                    if (ps.BorderSetting.BorderWidth > 0)
                    {
                        process     = container.Resolve <IProcess>("AddBorder");
                        normalImage = process.ProcessImage(normalImage, this.ps);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " added border for " + imagePath + " at " + DateTime.Now + ".");
                    }

                    // drop shadow operation
                    if (ps.DropShadowSetting.ShadowDepth > 0)
                    {
                        process     = container.Resolve <IProcess>("DropShadow");
                        normalImage = process.ProcessImage(normalImage, this.ps);
                        Trace.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " added dropshadow for " + imagePath + " at " + DateTime.Now + ".");
                    }

                    IFilenameProvider fileNameProvider;

                    if (ps.RenamingSetting.EnableBatchRename)
                    {
                        fileNameProvider = container.Resolve <IFilenameProvider>("BatchRenamedFileName");
                    }
                    else
                    {
                        fileNameProvider = container.Resolve <IFilenameProvider>("NormalFileName");
                    }
                    fileNameProvider.PS             = ps;
                    fileNameProvider.ImageIndex     = imageIndex;
                    fileNameProvider.SourceFileName = imagePath;

                    ISaveImage imageSaver;
                    if (format == ImageFormat.Jpeg)
                    {
                        imageSaver      = container.Resolve <ISaveImage>("SaveCompressedJpgImage");
                        imageSaver.Exif = exif;
                    }
                    else
                    {
                        imageSaver = container.Resolve <ISaveImage>("SaveNormalImage");
                    }
                    imageSaver.SaveImageToDisk(normalImage, format, fileNameProvider);

                    if (thumbImage != null)
                    {
                        // TODO think about applying thumbImage file name to batch renamed original file
                        fileNameProvider                = container.Resolve <IFilenameProvider>("ThumbFileName");
                        fileNameProvider.PS             = ps;
                        fileNameProvider.ImageIndex     = imageIndex;
                        fileNameProvider.SourceFileName = imagePath;
                        //saveImage(imagePath, thumbImage, format, fileNameProvider, imageSaver, imageIndex);
                        imageSaver.SaveImageToDisk(thumbImage, format, fileNameProvider);
                    }
                } catch (Exception ex) {
                    Trace.TraceError(ex.ToString());
                } finally {
                    if (normalImage != null)
                    {
                        // if there is an source image in queue which does not exist any more, this could be null.
                        normalImage.Dispose();
                        normalImage = null;
                    }

                    if (thumbImage != null)
                    {
                        thumbImage.Dispose();
                        thumbImage = null;
                    }

                    ImageProcessedEventArgs args = new ImageProcessedEventArgs(imagePath);
                    OnImageProcessed(args);
                }

                // recursively call itself to go back to check if there are more files waiting to be processed.
                ProcessImage(threadIndex);
            }
        }
 void engine_ImageProcessed(ImageProcessedEventArgs args)
 {
     View.ReportProgress();
 }