/// <summary> /// Decompress a JPEG image to an RGB, grayscale, or CMYK image. /// </summary> /// <param name="jpegBuf">Pointer to a buffer containing the JPEG image to decompress. This buffer is not modified.</param> /// <param name="jpegBufSize">Size of the JPEG image (in bytes).</param> /// <param name="outBuf">The buffer into which to store the decompressed JPEG image.</param> /// <param name="outBufSize">Size of <paramref name="outBuf"/> (in bytes).</param> /// <param name="destPixelFormat">Pixel format of the destination image (see <see cref="PixelFormat"/> "Pixel formats".)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags".</param> /// <param name="width">Width of image in pixels.</param> /// <param name="height">Height of image in pixels.</param> /// <param name="stride">Bytes per line in the destination image.</param> public unsafe void Decompress(IntPtr jpegBuf, ulong jpegBufSize, IntPtr outBuf, int outBufSize, TJPixelFormat destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (this.isDisposed) { throw new ObjectDisposedException("this"); } int subsampl; int colorspace; var funcResult = TurboJpegImport.TjDecompressHeader( this.decompressorHandle, jpegBuf, jpegBufSize, out width, out height, out subsampl, out colorspace); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } var targetFormat = destPixelFormat; stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[targetFormat]); var bufSize = stride * height; if (outBufSize < bufSize) { throw new ArgumentOutOfRangeException(nameof(outBufSize)); } funcResult = TurboJpegImport.TjDecompress( this.decompressorHandle, jpegBuf, jpegBufSize, outBuf, width, stride, height, (int)targetFormat, (int)flags); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } }