Beispiel #1
0
        /// <summary>
        /// Handles deleting a specific version of an image file according to file spec.
        /// </summary>
        private static async Task DeleteImageFileAsync(Image image, ImageFileSpec imageFileSpec)
        {
            if (image == null)
            {
                throw new ArgumentNullException(nameof(image));
            }

            var storageId = imageFileSpec.FileSpec switch
            {
                FileSpec.SpecOriginal => image.Files.OriginalId,
                FileSpec.Spec3840 => image.Files.Spec3840Id,
                FileSpec.Spec2560 => image.Files.Spec2560Id,
                FileSpec.Spec1920 => image.Files.Spec1920Id,
                FileSpec.Spec800 => image.Files.Spec800Id,
                FileSpec.SpecLowRes => image.Files.SpecLowResId,
                _ => string.Empty
            };

            if (!string.IsNullOrEmpty(storageId))
            {
                var container = Server.Instance.BlobServiceClient.GetBlobContainerClient(imageFileSpec.ContainerName);
                var response  = await container.DeleteBlobIfExistsAsync(storageId, DeleteSnapshotsOption.IncludeSnapshots);

                Log.Debug("ImageServer.DeleteImageFileAsync: response status: " + response.Value);
                return;
            }

            Log.Debug("ImageServer.DeleteImageFileAsync: storage id is null. FileSpec: " + imageFileSpec.FileSpec);
        }
Beispiel #2
0
        private static async Task <Stream> GenerateImageAsync(byte[] originalImage, ImageFileSpec imageFileSpec, Table table)
        {
            var individualImageStopwatch = new Stopwatch();

            individualImageStopwatch.Start();

            using (var job = new ImageJob())
            {
                var buildNode     = job.Decode(originalImage);
                var resampleHints = new ResampleHints();

                if (imageFileSpec.FileSpecFormat != FileSpecFormat.WebPLossless && imageFileSpec.SharpeningAmount > 0)
                {
                    resampleHints.SetSharpen(imageFileSpec.SharpeningAmount, SharpenWhen.Downscaling).SetResampleFilters(imageFileSpec.InterpolationFilter, null);
                }

                buildNode = buildNode.ConstrainWithin(imageFileSpec.PixelLength, imageFileSpec.PixelLength, resampleHints);
                IEncoderPreset encoderPreset;

                if (imageFileSpec.FileSpecFormat == FileSpecFormat.WebPLossless)
                {
                    encoderPreset = new WebPLosslessEncoder();
                }
                else if (imageFileSpec.FileSpecFormat == FileSpecFormat.WebPLossy)
                {
                    encoderPreset = new WebPLossyEncoder(imageFileSpec.Quality);
                }
                else
                {
                    encoderPreset = new MozJpegEncoder(imageFileSpec.Quality, true);
                }

                var result = await buildNode
                             .EncodeToBytes(encoderPreset)
                             .Finish()
                             .SetSecurityOptions(new SecurityOptions()
                                                 .SetMaxDecodeSize(new FrameSizeLimit(99999, 99999, 200))
                                                 .SetMaxFrameSize(new FrameSizeLimit(99999, 99999, 200))
                                                 .SetMaxEncodeSize(new FrameSizeLimit(99999, 99999, 200)))
                             .InProcessAsync();

                var newImageBytes = result.First.TryGetBytes();
                if (newImageBytes.HasValue)
                {
                    var newStream = new MemoryStream(newImageBytes.Value.ToArray());

                    individualImageStopwatch.Stop();
                    var kb   = newImageBytes.Value.Count / 1024;
                    var size = $"{kb} kb";
                    table.AddRow(imageFileSpec.ToString(), individualImageStopwatch.ElapsedMilliseconds.ToString(), size);

                    return(newStream);
                }
            }

            individualImageStopwatch.Stop();
            AnsiConsole.Render(new Markup("[bold red]Something went wrong with an image generation.[/]"));
            return(null);
        }
Beispiel #3
0
        private static async Task ProcessImageFileSpecAsync(byte[] fileBytes, ImageFileSpec spec, string inputImageOutputDirectory, Table table, ProgressTask overallProgress)
        {
            var extension = spec.FileSpecFormat == FileSpecFormat.Jpeg ? "jpg" : "webp";
            var filename  = $"{spec}.{extension}";
            var filePath  = Path.Combine(inputImageOutputDirectory, filename);

            await using var resizedImageStream = await GenerateImageAsync(fileBytes, spec, table);

            await using var fileStream = File.OpenWrite(filePath);
            await resizedImageStream.CopyToAsync(fileStream);

            overallProgress.Increment(OverallProgressIncrementAmount);
        }
Beispiel #4
0
        /// <summary>
        /// Generates an resized image of the original in WebP format (quicker, smaller files).
        /// </summary>
        /// <param name="image">The Image the new file should be generated for. Used for logging purposes.</param>
        /// <param name="originalImage">The byte array for the original image.</param>
        /// <param name="imageFileSpec">The name of the image file specification to base the new image.</param>
        /// <returns>A new image stream for the resized image</returns>
        private static async Task <Stream> GenerateImageAsync(Image image, byte[] originalImage, ImageFileSpec imageFileSpec)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            using (var job = new ImageJob())
            {
                var buildNode     = job.Decode(originalImage);
                var resampleHints = new ResampleHints();

                if (imageFileSpec.FileSpecFormat != FileSpecFormat.WebPLossless && imageFileSpec.SharpeningAmount > 0)
                {
                    resampleHints.SetSharpen(imageFileSpec.SharpeningAmount, SharpenWhen.Downscaling).SetResampleFilters(imageFileSpec.InterpolationFilter, null);
                }

                buildNode = buildNode.ConstrainWithin(imageFileSpec.PixelLength, imageFileSpec.PixelLength, resampleHints);
                IEncoderPreset encoderPreset;

                if (imageFileSpec.FileSpecFormat == FileSpecFormat.WebPLossless)
                {
                    encoderPreset = new WebPLosslessEncoder();
                }
                else if (imageFileSpec.FileSpecFormat == FileSpecFormat.WebPLossy)
                {
                    encoderPreset = new WebPLossyEncoder(imageFileSpec.Quality);
                }
                else
                {
                    encoderPreset = new MozJpegEncoder(imageFileSpec.Quality, true);
                }

                var result = await buildNode
                             .EncodeToBytes(encoderPreset)
                             .Finish()
                             .SetSecurityOptions(new SecurityOptions()
                                                 .SetMaxDecodeSize(new FrameSizeLimit(99999, 99999, 200))
                                                 .SetMaxFrameSize(new FrameSizeLimit(99999, 99999, 200))
                                                 .SetMaxEncodeSize(new FrameSizeLimit(99999, 99999, 200)))
                             .InProcessAsync();

                var newImageBytes = result.First.TryGetBytes();
                if (newImageBytes.HasValue)
                {
                    var newStream = new MemoryStream(newImageBytes.Value.ToArray());

                    stopwatch.Stop();
                    _log.Information($"LB.PhotoGalleries.Worker.Program.GenerateImageAsync() - Image {image.Id} and spec {imageFileSpec} done. Elapsed time: {stopwatch.ElapsedMilliseconds}ms");
                    return(newStream);
                }
            }

            stopwatch.Stop();
            _log.Warning($"LB.PhotoGalleries.Worker.Program.GenerateImageAsync() - Couldn't generate new image for {image.Id}! Elapsed time: {stopwatch.ElapsedMilliseconds}ms");
            return(null);
        }