Beispiel #1
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 #2
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);
        }