protected void OnImageProcessed(ImageProcessedEventArgs args) { if (ImageProcessed != null) { ImageProcessed(args); } }
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(); }