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); }
/// <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); }