public static Task <int> DebugDump(FileInfo source, string output, CancellationToken cancellationToken) { if (source is null || source.Length == 0) { Console.WriteLine("Input file are not specified."); return(Task.FromResult(1)); } if (string.IsNullOrEmpty(output)) { output = source.FullName; } byte[] input = File.ReadAllBytes(source.FullName); var decoder = new JpegDecoder(); decoder.SetInput(input); decoder.Identify(); int numberOfComponents = decoder.NumberOfComponents; if (numberOfComponents > 4) { throw new NotSupportedException("Number of components greater than 4 is not supported."); } ushort[] buffer = new ushort[decoder.Width * decoder.Height * 4]; var outputWriter = new JpegExtendingOutputWriter(decoder.Width, decoder.Height, 4, decoder.Precision, buffer); decoder.SetOutputWriter(outputWriter); decoder.Decode(); // We use RGBA PNG image to store 4 components. // Its content may be Grayscale, YCbCr or others. Rgba32[] pixels = new Rgba32[decoder.Width * decoder.Height]; Array.Fill(pixels, new Rgba32(255, 255, 255, 255)); using var image = Image.WrapMemory(pixels.AsMemory(), decoder.Width, decoder.Height); // high bits CopyHighBits(buffer, pixels, numberOfComponents); image.Save(output + ".high.png"); // apply prediction ApplyPrediction(buffer); // low bits CopyLowBits(buffer, pixels, numberOfComponents); image.Save(output + ".low-diff.png"); return(Task.FromResult(0)); }