public static void CompressWithoutTransparency(Surface surface, EncoderOptions options, AvifProgressCallback avifProgress, ref uint progressDone, uint progressTotal, CICPColorData colorInfo, out CompressedAV1Image color) { BitmapData bitmapData = new BitmapData { scan0 = surface.Scan0.Pointer, width = (uint)surface.Width, height = (uint)surface.Height, stride = (uint)surface.Stride }; ProgressContext progressContext = new ProgressContext(avifProgress, progressDone, progressTotal); using (CompressedAV1DataAllocator allocator = new CompressedAV1DataAllocator(1)) { IntPtr colorImage; CompressedAV1OutputAlloc outputAllocDelegate = new CompressedAV1OutputAlloc(allocator.Allocate); EncoderStatus status = EncoderStatus.Ok; if (IntPtr.Size == 8) { status = AvifNative_64.CompressImage(ref bitmapData, options, progressContext, ref colorInfo, outputAllocDelegate, out colorImage, IntPtr.Zero); } else { status = AvifNative_86.CompressImage(ref bitmapData, options, progressContext, ref colorInfo, outputAllocDelegate, out colorImage, IntPtr.Zero); } GC.KeepAlive(outputAllocDelegate); if (status != EncoderStatus.Ok) { HandleError(status, allocator.ExceptionInfo); } color = new CompressedAV1Image(allocator.GetCompressedAV1Data(colorImage), surface.Width, surface.Height, options.yuvFormat); } progressDone = progressContext.progressDone; GC.KeepAlive(avifProgress); }
public static void DecompressAlpha(AvifItemData alphaImage, DecodeInfo decodeInfo, Surface fullSurface) { if (alphaImage is null) { ExceptionUtil.ThrowArgumentNullException(nameof(alphaImage)); } if (decodeInfo is null) { ExceptionUtil.ThrowArgumentNullException(nameof(decodeInfo)); } if (fullSurface is null) { ExceptionUtil.ThrowArgumentNullException(nameof(fullSurface)); } DecoderStatus status = DecoderStatus.Ok; unsafe { alphaImage.UseBufferPointer((ptr, length) => { BitmapData bitmapData = new BitmapData { scan0 = fullSurface.Scan0.Pointer, width = (uint)fullSurface.Width, height = (uint)fullSurface.Height, stride = (uint)fullSurface.Stride }; UIntPtr alphaImageSize = new UIntPtr(length); if (IntPtr.Size == 8) { status = AvifNative_64.DecompressAlphaImage(ptr, alphaImageSize, decodeInfo, ref bitmapData); } else { status = AvifNative_86.DecompressAlphaImage(ptr, alphaImageSize, decodeInfo, ref bitmapData); } }); } if (status != DecoderStatus.Ok) { HandleError(status); } }
public static void DecompressColor(AvifItemData colorImage, CICPColorData?colorConversionInfo, DecodeInfo decodeInfo, Surface fullSurface) { if (colorImage is null) { ExceptionUtil.ThrowArgumentNullException(nameof(colorImage)); } if (decodeInfo is null) { ExceptionUtil.ThrowArgumentNullException(nameof(decodeInfo)); } if (fullSurface is null) { ExceptionUtil.ThrowArgumentNullException(nameof(fullSurface)); } DecoderStatus status = DecoderStatus.Ok; unsafe { colorImage.UseBufferPointer((ptr, length) => { BitmapData bitmapData = new BitmapData { scan0 = fullSurface.Scan0.Pointer, width = (uint)fullSurface.Width, height = (uint)fullSurface.Height, stride = (uint)fullSurface.Stride }; UIntPtr colorImageSize = new UIntPtr(length); if (colorConversionInfo.HasValue) { CICPColorData colorData = colorConversionInfo.Value; if (IntPtr.Size == 8) { status = AvifNative_64.DecompressColorImage(ptr, colorImageSize, ref colorData, decodeInfo, ref bitmapData); } else { status = AvifNative_86.DecompressColorImage(ptr, colorImageSize, ref colorData, decodeInfo, ref bitmapData); } } else { if (IntPtr.Size == 8) { status = AvifNative_64.DecompressColorImage(ptr, colorImageSize, IntPtr.Zero, decodeInfo, ref bitmapData); } else { status = AvifNative_86.DecompressColorImage(ptr, colorImageSize, IntPtr.Zero, decodeInfo, ref bitmapData); } } }); } if (status != DecoderStatus.Ok) { HandleError(status); } }