/// <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> /// <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 Bitmap Decompress(IntPtr jpegBuf, ulong jpegBufSize, PixelFormat destPixelFormat, TJFlags flags) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var targetFormat = TJUtils.ConvertPixelFormat(destPixelFormat); int width; int height; int stride; var buffer = Decompress(jpegBuf, jpegBufSize, targetFormat, flags, out width, out height, out stride); Bitmap result; fixed(byte *bufferPtr = buffer) { result = new Bitmap(width, height, stride, destPixelFormat, (IntPtr)bufferPtr); if (destPixelFormat == PixelFormat.Format8bppIndexed) { result.Palette = FixPaletteToGrayscale(result.Palette); } } return(result); }
/// <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="PixelFormat"/> "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, PixelFormat pixelFormat = PixelFormat.Format32bppArgb, TJSubsamplingOptions subSamp = TJSubsamplingOptions.TJSAMP_420, int quality = 50, TJFlags flags = TJFlags.FASTDCT) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var tjPixelFormat = TJUtils.ConvertPixelFormat(pixelFormat); CheckOptionsCompatibilityAndThrow(subSamp, tjPixelFormat); TJDoCompDel compresscall = TurboJpegImport.tjCompress2; if (isXPlatform) { compresscall = TurboJpegImport_xplat.tjCompressX; } var buf = IntPtr.Zero; ulong bufSize = 0; try { var result = compresscall( _compressorHandle, srcPtr, width, stride, height, (int)tjPixelFormat, 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 input image to the jpeg format with specified quality /// </summary> /// <param name="srcBuf"> /// 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="PixelFormat"/> "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 unsafe byte[] Compress(byte[] srcBuf, int stride, int width, int height, PixelFormat pixelFormat, TJSubsamplingOptions subSamp, int quality, TJFlags flags) { if (_isDisposed) { throw new ObjectDisposedException("this"); } var tjPixelFormat = TJUtils.ConvertPixelFormat(pixelFormat); CheckOptionsCompatibilityAndThrow(subSamp, tjPixelFormat); var buf = IntPtr.Zero; ulong bufSize = 0; try { fixed(byte *srcBufPtr = srcBuf) { var result = TurboJpegImport.tjCompress2( _compressorHandle, (IntPtr)srcBufPtr, width, stride, height, (int)tjPixelFormat, 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 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="PixelFormat"/> "Pixel formats").</param> /// <param name="subSamp"> /// The level of chrominance subsampling to be used when /// generating the JPEG image (see <see cref="TJSubsamplingOption"/> "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> /// <returns> /// A <see cref="byte"/> array containing the compressed image. /// </returns> /// <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="TJSubsamplingOption.Gray"/> and pixel format <see cref="TJPixelFormat.Gray"/></description></item> /// </list> /// </exception> public byte[] Compress(IntPtr srcPtr, int stride, int width, int height, PixelFormat pixelFormat, TJSubsamplingOption subSamp, int quality, TJFlags flags) { if (this.isDisposed) { throw new ObjectDisposedException("this"); } var tjPixelFormat = TJUtils.ConvertPixelFormat(pixelFormat); CheckOptionsCompatibilityAndThrow(subSamp, tjPixelFormat); var buf = IntPtr.Zero; ulong bufSize = 0; try { var result = TurboJpegImport.TjCompress2( this.compressorHandle, srcPtr, width, stride, height, (int)tjPixelFormat, ref buf, ref bufSize, (int)subSamp, quality, (int)flags); if (result == -1) { TJUtils.GetErrorAndThrow(); } var jpegBuf = new byte[bufSize]; Marshal.Copy(buf, jpegBuf, 0, (int)bufSize); return(jpegBuf); } finally { TurboJpegImport.TjFree(buf); } }
/// <summary> /// Compresses input image to the jpeg format with specified quality. /// </summary> /// <param name="srcBuf"> /// Image buffer containing RGB, grayscale, or CMYK pixels to be compressed. /// This buffer is not modified. /// </param> /// <param name="destBuf"> /// A <see cref="byte"/> array containing the compressed image. /// </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="PixelFormat"/> "Pixel formats").</param> /// <param name="subSamp"> /// The level of chrominance subsampling to be used when /// generating the JPEG image (see <see cref="TJSubsamplingOption"/> "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> /// <returns> /// A <see cref="Span{T}"/> which is a slice of <paramref name="destBuf"/> which holds the compressed image. /// </returns> /// <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="TJSubsamplingOption.Gray"/> and pixel format <see cref="TJPixelFormat.Gray"/></description></item> /// </list> /// </exception> public unsafe Span <byte> Compress(Span <byte> srcBuf, Span <byte> destBuf, int stride, int width, int height, PixelFormat pixelFormat, TJSubsamplingOption subSamp, int quality, TJFlags flags) { var tjPixelFormat = TJUtils.ConvertPixelFormat(pixelFormat); return(this.Compress(srcBuf, destBuf, stride, width, height, tjPixelFormat, subSamp, quality, flags)); }