/// <summary> /// Decompresses JPEG image to any image described as ICompressDestination /// </summary> /// <param name="jpeg">Stream with JPEG data</param> /// <param name="destination">Stream for output of compressed JPEG</param> public void Decompress(Stream jpeg, IDecompressDestination destination) { if (jpeg is null) { throw new ArgumentNullException(nameof(jpeg)); } if (destination is null) { throw new ArgumentNullException(nameof(destination)); } beforeDecompress(jpeg); // Start decompression ClassicDecompressor.JpegStartDecompress(); var parameters = getImageParametersFromDecompressor(); destination.SetImageAttributes(parameters); destination.BeginWrite(); /* Process data */ while (ClassicDecompressor.Output_scanline < ClassicDecompressor.Output_height) { var row = JpegCommonStruct.AllocJpegSamples(ClassicDecompressor.Output_width * ClassicDecompressor.Output_components, 1); ClassicDecompressor.JpegReadScanlines(row, 1); destination.ProcessPixelsRow(row[0]); } destination.EndWrite(); // Finish decompression and release memory. ClassicDecompressor.JpegFinishDecompress(); }
/// <summary> /// Tunes decompressor /// </summary> /// <param name="jpeg">Stream with input compressed JPEG data</param> private void beforeDecompress(Stream jpeg) { ClassicDecompressor.JpegStdioSrc(jpeg); /* Read file header, set default decompression parameters */ ClassicDecompressor.JpegReadHeader(true); applyParameters(m_decompressionParameters); ClassicDecompressor.JpegCalcOutputDimensions(); }
/// <summary> /// Tunes decompressor /// </summary> /// <param name="jpeg">Stream with input compressed JPEG data</param> #pragma warning disable IDE1006 // Naming Styles private void beforeDecompress(Stream jpeg) #pragma warning restore IDE1006 // Naming Styles { ClassicDecompressor.JpegStdioSrc(jpeg); /* Read file header, set default decompression parameters */ ClassicDecompressor.JpegReadHeader(true); applyParameters(m_decompressionParameters); ClassicDecompressor.JpegCalcOutputDimensions(); }