/// <summary> /// <inheritdoc /> /// </summary> public ImageThumbPathsModel PrepareThumbFilePath(StoragePathModel originalPath, OutputImageFormat format, int width, int height) { // Prepare a disk path var diskPath = $"{Path.ChangeExtension(originalPath.FilePath, null)}_thumb_{width}x{height}.{format.GetImageFormat()}"; // Prepare an URL path var url = this.NormalizeWebPath(Path.ChangeExtension(originalPath.UrlPath, null)) + $"_thumb_{width}x{height}.{format.GetImageFormat()}"; return(new ImageThumbPathsModel { DiskPath = diskPath, Url = url }); }
/// <summary> /// <inheritdoc /> /// </summary> public async Task <ImageUploadDbModel> Create( StoragePathModel storagePath, List <ImageThumbnailResultModel> thumbnails, string ipAddress, int?lifetime) { DateTimeOffset?expirationDate = lifetime.HasValue ? DateTimeOffset.UtcNow.AddSeconds(lifetime.Value) : null; var dbModel = new ImageUploadDbModel { UploadId = storagePath.Key, OriginalFilePath = storagePath.FilePath, Thumbnails = thumbnails, IpAddress = ipAddress, ExpiresAt = expirationDate }; await this.Create(dbModel); return(dbModel); }
/// <summary> /// Performs an image handling (resizing, effects, etc) and flushing to disk /// </summary> /// <param name="uploadJob"></param> /// <param name="sourceImage"></param> /// <param name="storagePath"></param> /// <returns></returns> private async Task <List <ImageThumbnailResultModel> > GenerateThumbnails( ImageUploadJob uploadJob, MagickImage sourceImage, StoragePathModel storagePath) { var resultsList = new List <ImageThumbnailResultModel>(); var thumbnailParams = await GetThumbnailParams(uploadJob); foreach (var thumbParam in thumbnailParams) { this.logger.LogInformation($"Begin a thumbnail processing with params ({thumbParam.Width}, {thumbParam.Height})"); // Prepare an image processing job var job = new ImageProcessingJob { Image = sourceImage, Settings = this.appSettings.Value.ImageProcessing, ThumbnailParams = thumbParam }; // Run an image processing job var processedImage = this.imageProcessingService.Process(job); // If watermark parameters were provided then apply a watermark if (thumbParam.Watermark != null) { using var watermarkImage = await this.imageReadingService.Read(thumbParam.Watermark.Url); processedImage = this.imageProcessingService.AddWatermark(processedImage, watermarkImage); } // Prepare disk paths to be used to save images var paths = this.fileService.PrepareThumbFilePath(storagePath, uploadJob.Params.OutputFormat, processedImage.Width, processedImage.Height); // Quality can be defined for each thumbnail individually // Otherwise a JPEG quality value will be loaded from the application settings or app default value var quality = thumbParam.Quality ?? this.appSettings.Value.ImageProcessing.JpegQuality ?? Constants.DefaultJpegQuality; // Save a processed image to the disk await this.imageWritingService.WriteToDisk(processedImage, new DiskImageSavingParamsModel { Format = uploadJob.Params.OutputFormat, Path = paths.DiskPath, Quality = quality }); this.logger.LogInformation($"Thumbnail processing finished. File saved as {paths.DiskPath}"); var thumbnailResult = new ImageThumbnailResultModel { Width = processedImage.Width, Height = processedImage.Height, Url = paths.Url, DiskPath = paths.DiskPath }; processedImage.Dispose(); resultsList.Add(thumbnailResult); } return(resultsList); }