Ejemplo n.º 1
0
        /// <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
            });
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }