public DecompressedImage(int width, int height, int rowBytes, byte[] data, TJPixelFormats pixelFormat) { Width = width; Height = height; RowBytes = rowBytes; Data = data; PixelFormat = pixelFormat; }
/// <summary> /// Retrieve information about a JPEG image without decompressing it. /// </summary> /// <param name="jpegBuf"> /// Pointer to a buffer containing a JPEG image. This buffer is not modified. /// </param> /// <param name="jpegBufSize"> /// Size of the JPEG image (in bytes) /// </param> /// <param name="destPixelFormat"> /// The pixel format of the uncompressed image. /// </param> /// <param name="width"> /// Pointer to an integer variable that will receive the width (in pixels) of the JPEG image /// </param> /// <param name="height"> /// Pointer to an integer variable that will receive the height (in pixels) of the JPEG image /// </param> /// <param name="stride"> /// Pointer to an integer variable that will receive the stride (in bytes) of the JPEG image. /// </param> /// <param name="bufSize"> /// The size of a buffer that can receive the uncompressed JPEG image. /// </param> public void GetImageInfo(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, out int width, out int height, out int stride, out int bufSize) { int subsampl; int colorspace; var funcResult = TurboJpegImport.tjDecompressHeader(_decompressorHandle, jpegBuf, jpegBufSize, out width, out height, out subsampl, out colorspace); stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[destPixelFormat]); bufSize = stride * height; }
/// <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="destPixelFormat">Pixel format of the destination image (see <see cref="TJPixelFormats"/> "Pixel formats".)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags"</param> /// <returns>Decompressed image of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> /// <exception cref="NotSupportedException">Convertion to the requested pixel format can not be performed</exception> public DecompressedImage Decompress(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, TJFlags flags) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var buffer = Decompress(jpegBuf, jpegBufSize, destPixelFormat, flags, out var width, out var height, out var stride); return(new DecompressedImage(width, height, stride, buffer, destPixelFormat)); }
/// <summary> /// Decompress a JPEG image to an RGB, grayscale, or CMYK image. /// </summary> /// <param name="jpegBuf">A buffer containing the JPEG image to decompress. This buffer is not modified</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> /// <returns>Raw pixel data of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> public unsafe byte[] Decompress(byte[] jpegBuf, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var jpegBufSize = (ulong)jpegBuf.Length; fixed(byte *jpegPtr = jpegBuf) { return(Decompress((IntPtr)jpegPtr, jpegBufSize, destPixelFormat, flags, out width, out height, out stride)); } }
/// <summary> /// Decompress a JPEG image to an RGB, grayscale, or CMYK image. /// </summary> /// <param name="jpegBuf">A buffer containing the JPEG image to decompress. This buffer is not modified</param> /// <param name="destPixelFormat">Pixel format of the destination image (see <see cref="TJPixelFormats"/> "Pixel formats".)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags"</param> /// <returns>Decompressed image of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> /// <exception cref="NotSupportedException">Convertion to the requested pixel format can not be performed</exception> public unsafe DecompressedImage Decompress(byte[] jpegBuf, TJPixelFormats destPixelFormat, TJFlags flags) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var jpegBufSize = (ulong)jpegBuf.Length; fixed(byte *jpegPtr = jpegBuf) { return(Decompress((IntPtr)jpegPtr, jpegBufSize, destPixelFormat, flags)); } }
/// <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="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> /// <returns>Raw pixel data of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> public unsafe byte[] Decompress(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { int outBufSize; this.GetImageInfo(jpegBuf, jpegBufSize, destPixelFormat, out width, out height, out stride, out outBufSize); var buf = new byte[outBufSize]; fixed (byte* bufPtr = buf) { this.Decompress(jpegBuf, jpegBufSize, (IntPtr)bufPtr, outBufSize, destPixelFormat, flags, out width, out height, out stride); } return buf; }
/// <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="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> /// <returns>Raw pixel data of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> public unsafe byte[] Decompress(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { int outBufSize; this.GetImageInfo(jpegBuf, jpegBufSize, destPixelFormat, out width, out height, out stride, out outBufSize); var buf = new byte[outBufSize]; fixed(byte *bufPtr = buf) { this.Decompress(jpegBuf, jpegBufSize, (IntPtr)bufPtr, outBufSize, destPixelFormat, flags, out width, out height, out stride); } return(buf); }
/// <summary> /// Compresses input image to the jpeg format with specified quality /// </summary> /// <param name="srcPtr"> /// Pointer to an image buffer containing RGB, grayscale, or CMYK pixels to be compressed. /// This buffer is not modified. /// </param> /// <param name="stride"> /// Bytes per line in the source image. /// Normally, this should be <c>width * BytesPerPixel</c> if the image is unpadded, /// or <c>TJPAD(width * BytesPerPixel</c> if each line of the image /// is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. /// You can also be clever and use this parameter to skip lines, etc. /// Setting this parameter to 0 is the equivalent of setting it to /// <c>width * BytesPerPixel</c>. /// </param> /// <param name="width">Width (in pixels) of the source image</param> /// <param name="height">Height (in pixels) of the source image</param> /// <param name="tjPixelFormat">Pixel format of the source image (see <see cref="TJPixelFormats"/> "Pixel formats")</param> /// <param name="subSamp"> /// The level of chrominance subsampling to be used when /// generating the JPEG image (see <see cref="TJSubsamplingOptions"/> "Chrominance subsampling options".) /// </param> /// <param name="quality">The image quality of the generated JPEG image (1 = worst, 100 = best)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags"</param> /// <param name="onAsyncCompressionCompleted">Method to process compressed data</param> /// <param name="state">User-defined state passed to <paramref name="onAsyncCompressionCompleted"/> method</param> /// <param name="cancellationToken">Cancellation token.</param> /// <exception cref="TJException">Throws if compress function failed.</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> /// <exception cref="NotSupportedException"> /// Some parameters' values are incompatible: /// <list type="bullet"> /// <item><description>Subsampling not equals to <see cref="TJSubsamplingOptions.TJSAMP_GRAY"/> and pixel format <see cref="TJPixelFormats.TJPF_GRAY"/></description></item> /// </list> /// </exception> /// <returns> /// </returns> public async Task CompressAsync(IntPtr srcPtr, int stride, int width, int height, TJPixelFormats tjPixelFormat, TJSubsamplingOptions subSamp, int quality, TJFlags flags, TJAsyncCompressionComplete onAsyncCompressionCompleted, object state, CancellationToken cancellationToken) { if (_isDisposed) { throw new ObjectDisposedException("this"); } if (onAsyncCompressionCompleted == null) { throw new ArgumentNullException(nameof(onAsyncCompressionCompleted)); } CheckOptionsCompatibilityAndThrow(subSamp, tjPixelFormat); var buf = IntPtr.Zero; ulong bufSize = 0; try { var result = TurboJpegImport.tjCompress2( _compressorHandle, srcPtr, width, stride, height, (int)tjPixelFormat, ref buf, ref bufSize, (int)subSamp, quality, (int)flags); if (result == -1) { TJUtils.GetErrorAndThrow(); } await onAsyncCompressionCompleted(buf, (int)bufSize, state, cancellationToken); } finally { TurboJpegImport.tjFree(buf); } }
/// <summary> /// Returns info about jpeg image without decompressing it /// </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="destPixelFormat">Pixel format of the destination image</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> /// <param name="decompressedBufferSize">Size in bytes for buffer where decompressed image will be put</param> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> /// <returns></returns> public void GetImageInfo(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, out int width, out int height, out int stride, out int decompressedBufferSize) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var funcResult = TurboJpegImport.tjDecompressHeader(_decompressorHandle, jpegBuf, jpegBufSize, out width, out height, out _, out _); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[destPixelFormat]); decompressedBufferSize = stride * height; }
/// <summary> /// Compresses input image to the jpeg format with specified quality /// </summary> /// <param name="srcPtr"> /// Pointer to an image buffer containing RGB, grayscale, or CMYK pixels to be compressed. /// This buffer is not modified. /// </param> /// <param name="stride"> /// Bytes per line in the source image. /// Normally, this should be <c>width * BytesPerPixel</c> if the image is unpadded, /// or <c>TJPAD(width * BytesPerPixel</c> if each line of the image /// is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. /// You can also be clever and use this parameter to skip lines, etc. /// Setting this parameter to 0 is the equivalent of setting it to /// <c>width * BytesPerPixel</c>. /// </param> /// <param name="width">Width (in pixels) of the source image</param> /// <param name="height">Height (in pixels) of the source image</param> /// <param name="pixelFormat">Pixel format of the source image (see <see cref="TJPixelFormats"/> "Pixel formats")</param> /// <param name="subSamp"> /// The level of chrominance subsampling to be used when /// generating the JPEG image (see <see cref="TJSubsamplingOptions"/> "Chrominance subsampling options".) /// </param> /// <param name="quality">The image quality of the generated JPEG image (1 = worst, 100 = best)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags"</param> /// <exception cref="TJException"> Throws if compress function failed </exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> /// <exception cref="NotSupportedException"> /// Some parameters' values are incompatible: /// <list type="bullet"> /// <item><description>Subsampling not equals to <see cref="TJSubsamplingOptions.TJSAMP_GRAY"/> and pixel format <see cref="TJPixelFormats.TJPF_GRAY"/></description></item> /// </list> /// </exception> public byte[] Compress(IntPtr srcPtr, int stride, int width, int height, TJPixelFormats pixelFormat, TJSubsamplingOptions subSamp, int quality, TJFlags flags) { if (_isDisposed) { throw new ObjectDisposedException("this"); } CheckOptionsCompatibilityAndThrow(subSamp, pixelFormat); var buf = IntPtr.Zero; ulong bufSize = 0; try { var result = TurboJpegImport.tjCompress2( _compressorHandle, srcPtr, width, stride, height, (int)pixelFormat, ref buf, ref bufSize, (int)subSamp, quality, (int)flags); if (result == -1) { TJUtils.GetErrorAndThrow(); } var jpegBuf = new byte[bufSize]; // ReSharper disable once ExceptionNotDocumentedOptional Marshal.Copy(buf, jpegBuf, 0, (int)bufSize); return(jpegBuf); } finally { TurboJpegImport.tjFree(buf); } }
/// <summary> /// Compresses the bitmap to an output buffer, returning the length if the compressed data /// </summary> /// <remarks> /// The buffer is re-allocated if too small, and can be larger than the compressed data! /// </remarks> public int Compress( ref byte[] buffer, int bufferOffset, IntPtr srcPtr, int stride, int width, int height, PixelFormat pixelFormat, int quality) { lock (this) { var bufferHandle = ObtainHandleUnderLock(); TJPixelFormats srcFormat = ConvertPixelFormat(pixelFormat); JpegLibrary.CheckOptionsCompatibilityAndThrow(SubSampling, srcFormat); ulong jpegSize = (ulong)MaxBufferSize; lock (_compressor) { var compressorHandle = _compressor.ObtainHandleUnderLock(); if (JpegLibrary.tjCompress2(compressorHandle, srcPtr, width, stride, height, (int)srcFormat, ref bufferHandle, ref jpegSize, (int)SubSampling, quality, (int)(TJFlags.NOREALLOC | TJFlags.FASTDCT)) == -1) { GetErrorAndThrow(); } int length = (int)jpegSize; if (buffer == null || buffer.Length < (bufferOffset + length)) { Array.Resize(ref buffer, bufferOffset + MaxBufferSize); } Marshal.Copy(bufferHandle, buffer, bufferOffset, length); return(length); } } }
/// <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="destPixelFormat">Pixel format of the destination image</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> /// <returns>Raw pixel data of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> public unsafe byte[] Decompress(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var funcResult = TurboJpegImport.tjDecompressHeader(_decompressorHandle, jpegBuf, jpegBufSize, out width, out height, out _, out _); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } var targetFormat = destPixelFormat; stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[targetFormat]); var bufSize = stride * height; var buf = new byte[bufSize]; fixed(byte *bufPtr = buf) { funcResult = TurboJpegImport.tjDecompress( _decompressorHandle, jpegBuf, jpegBufSize, (IntPtr)bufPtr, width, stride, height, (int)targetFormat, (int)flags); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } return(buf); } }
public unsafe void Decompress(IntPtr jpegBuf, ulong jpegBufSize, IntPtr outBuf, int outBufSize, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (_isDisposed) throw new ObjectDisposedException("this"); int subsampl; int colorspace; var funcResult = TurboJpegImport.tjDecompressHeader(_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( _decompressorHandle, jpegBuf, jpegBufSize, outBuf, width, stride, height, (int)targetFormat, (int)flags); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } }
private static void CheckOptionsCompatibilityAndThrow(TJSubsamplingOptions subSamp, TJPixelFormats srcFormat) { if (srcFormat == TJPixelFormats.TJPF_GRAY && subSamp != TJSubsamplingOptions.TJSAMP_GRAY) { throw new NotSupportedException( $"Subsampling differ from {TJSubsamplingOptions.TJSAMP_GRAY} for pixel format {TJPixelFormats.TJPF_GRAY} is not supported"); } }
private static void CheckOptionsCompatibilityAndThrow(TJSubsamplingOptions subSamp, TJPixelFormats srcFormat) { if (srcFormat == TJPixelFormats.TJPF_GRAY && subSamp != TJSubsamplingOptions.TJSAMP_GRAY) throw new NotSupportedException( $"Subsampling differ from {TJSubsamplingOptions.TJSAMP_GRAY} for pixel format {TJPixelFormats.TJPF_GRAY} is not supported"); }
/// <summary> /// Given the size of an image, determines the size of a decompressed image. /// </summary> /// <param name="height"> /// The height of the image. /// </param> /// <param name="width"> /// The width of the image. /// </param> /// <param name="destPixelFormat"> /// The pixel format of the uncompressed image. /// </param> /// <returns> /// The size of a buffer that can hold the uncompressed image. /// </returns> public int GetBufferSize(int height, int width, TJPixelFormats destPixelFormat) { int stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[destPixelFormat]); return stride * height; }
/// <summary> /// Decompress a JPEG image to an RGB, grayscale, or CMYK image into precreated unmanaged buffer /// </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">Pointer to output buffer where decompressed image will be put. Buffer must be created before call</param> /// <param name="outBufSize">Size of output buffer (in bytes). It must be greater or equal than size of decompressed image</param> /// <param name="destPixelFormat">Pixel format of the destination image (see <see cref="TJPixelFormats"/> "Pixel formats".)</param> /// <param name="flags">The bitwise OR of one or more of the <see cref="TJFlags"/> "flags"</param> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Global public void Decompress(IntPtr jpegBuf, ulong jpegBufSize, IntPtr outBuf, int outBufSize, TJPixelFormats destPixelFormat, TJFlags flags) { GetImageInfo(jpegBuf, jpegBufSize, destPixelFormat, out var width, out var height, out var stride, out var bufSize); if (outBufSize < bufSize) { throw new ArgumentOutOfRangeException("outBufSize"); } var funcResult = TurboJpegImport.tjDecompress( _decompressorHandle, jpegBuf, jpegBufSize, outBuf, width, stride, height, (int)destPixelFormat, (int)flags); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } }
/// <summary> /// Given the size of an image, determines the size of a decompressed image. /// </summary> /// <param name="height"> /// The height of the image. /// </param> /// <param name="width"> /// The width of the image. /// </param> /// <param name="destPixelFormat"> /// The pixel format of the uncompressed image. /// </param> /// <returns> /// The size of a buffer that can hold the uncompressed image. /// </returns> public int GetBufferSize(int height, int width, TJPixelFormats destPixelFormat) { int stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[destPixelFormat]); return(stride * height); }
/// <summary> /// Decompress a JPEG image to an RGB, grayscale, or CMYK image. /// </summary> /// <param name="jpegBuf">A buffer containing the JPEG image to decompress. This buffer is not modified</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> /// <returns>Raw pixel data of specified format</returns> /// <exception cref="TJException">Throws if underlying decompress function failed</exception> /// <exception cref="ObjectDisposedException">Object is disposed and can not be used anymore</exception> public unsafe byte[] Decompress(byte[] jpegBuf, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (_isDisposed) throw new ObjectDisposedException("this"); var jpegBufSize = (ulong)jpegBuf.Length; fixed (byte* jpegPtr = jpegBuf) { return Decompress((IntPtr)jpegPtr, jpegBufSize, destPixelFormat, flags, out width, out height, out stride); } }
public unsafe void Decompress(IntPtr jpegBuf, ulong jpegBufSize, IntPtr outBuf, int outBufSize, TJPixelFormats destPixelFormat, TJFlags flags, out int width, out int height, out int stride) { if (_isDisposed) { throw new ObjectDisposedException("this"); } int subsampl; int colorspace; var funcResult = TurboJpegImport.tjDecompressHeader(_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( _decompressorHandle, jpegBuf, jpegBufSize, outBuf, width, stride, height, (int)targetFormat, (int)flags); if (funcResult == -1) { TJUtils.GetErrorAndThrow(); } }
/// <summary> /// Retrieve information about a JPEG image without decompressing it. /// </summary> /// <param name="jpegBuf"> /// Pointer to a buffer containing a JPEG image. This buffer is not modified. /// </param> /// <param name="jpegBufSize"> /// Size of the JPEG image (in bytes) /// </param> /// <param name="destPixelFormat"> /// The pixel format of the uncompressed image. /// </param> /// <param name="width"> /// Pointer to an integer variable that will receive the width (in pixels) of the JPEG image /// </param> /// <param name="height"> /// Pointer to an integer variable that will receive the height (in pixels) of the JPEG image /// </param> /// <param name="stride"> /// Pointer to an integer variable that will receive the stride (in bytes) of the JPEG image. /// </param> /// <param name="bufSize"> /// The size of a buffer that can receive the uncompressed JPEG image. /// </param> public void GetImageInfo(IntPtr jpegBuf, ulong jpegBufSize, TJPixelFormats destPixelFormat, out int width, out int height, out int stride, out int bufSize) { int subsampl; int colorspace; var funcResult = TurboJpegImport.tjDecompressHeader(_decompressorHandle, jpegBuf, jpegBufSize, out width, out height, out subsampl, out colorspace); stride = TurboJpegImport.TJPAD(width * TurboJpegImport.PixelSizes[destPixelFormat]); bufSize = stride * height; }