/// <summary> /// Executes the image enhancers. /// </summary> /// <param name="imageEnhancers">The image enhancers.</param> /// <param name="originalImage">The original image.</param> /// <param name="item">The item.</param> /// <param name="imageType">Type of the image.</param> /// <param name="imageIndex">Index of the image.</param> /// <returns>Task{EnhancedImage}.</returns> private async Task<ImageStream> ExecuteImageEnhancers(IEnumerable<IImageEnhancer> imageEnhancers, ImageStream originalImage, IHasImages item, ImageType imageType, int imageIndex) { var result = originalImage; // Run the enhancers sequentially in order of priority foreach (var enhancer in imageEnhancers) { var typeName = enhancer.GetType().Name; try { result = await enhancer.EnhanceImageAsync(item, result, imageType, imageIndex).ConfigureAwait(false); } catch (Exception ex) { _logger.ErrorException("{0} failed enhancing {1}", ex, typeName, item.Name); throw; } } return result; }
/// <summary> /// Runs an image through the image enhancers, caches the result, and returns the cached path /// </summary> /// <param name="originalImagePath">The original image path.</param> /// <param name="item">The item.</param> /// <param name="imageType">Type of the image.</param> /// <param name="imageIndex">Index of the image.</param> /// <param name="supportedEnhancers">The supported enhancers.</param> /// <param name="cacheGuid">The cache unique identifier.</param> /// <returns>System.String.</returns> /// <exception cref="System.ArgumentNullException">originalImagePath</exception> private async Task<string> GetEnhancedImageInternal(string originalImagePath, IHasImages item, ImageType imageType, int imageIndex, IEnumerable<IImageEnhancer> supportedEnhancers, string cacheGuid) { if (string.IsNullOrEmpty(originalImagePath)) { throw new ArgumentNullException("originalImagePath"); } if (item == null) { throw new ArgumentNullException("item"); } // All enhanced images are saved as png to allow transparency var enhancedImagePath = GetCachePath(EnhancedImageCachePath, cacheGuid + ".png"); var semaphore = GetLock(enhancedImagePath); await semaphore.WaitAsync().ConfigureAwait(false); // Check again in case of contention if (File.Exists(enhancedImagePath)) { semaphore.Release(); return enhancedImagePath; } try { using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { // Copy to memory stream to avoid Image locking file using (var memoryStream = new MemoryStream()) { await fileStream.CopyToAsync(memoryStream).ConfigureAwait(false); memoryStream.Position = 0; var imageStream = new ImageStream { Stream = memoryStream, Format = GetFormat(originalImagePath) }; //Pass the image through registered enhancers using (var newImageStream = await ExecuteImageEnhancers(supportedEnhancers, imageStream, item, imageType, imageIndex).ConfigureAwait(false)) { var parentDirectory = Path.GetDirectoryName(enhancedImagePath); Directory.CreateDirectory(parentDirectory); // Save as png if (newImageStream.Format == Model.Drawing.ImageFormat.Png) { //And then save it in the cache using (var outputStream = _fileSystem.GetFileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read, false)) { await newImageStream.Stream.CopyToAsync(outputStream).ConfigureAwait(false); } } else { using (var newImage = Image.FromStream(newImageStream.Stream, true, false)) { //And then save it in the cache using (var outputStream = _fileSystem.GetFileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read, false)) { newImage.Save(System.Drawing.Imaging.ImageFormat.Png, outputStream, 100); } } } } } } } finally { semaphore.Release(); } return enhancedImagePath; }