CoreImageExtensions
using System.IO;
using System.Runtime.CompilerServices;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.GdiPlus;
using Windows.Win32.System.Com;
namespace System.Drawing
{
[NullableContext(1)]
[Nullable(0)]
internal static class CoreImageExtensions
{
internal unsafe static void Save(this IImage image, Stream stream, Guid encoder, Guid format, [Nullable(0)] EncoderParameters* encoderParameters)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
if (encoder == Guid.Empty)
throw new ArgumentNullException("encoder");
if (format == PInvokeCore.ImageFormatGIF) {
ReadOnlySpan<byte> data = image.Data;
if (data.Length > 0) {
stream.Write(data);
return;
}
}
ComScope<IStream> scope = stream.ToIStream(false);
try {
PInvokeCore.GdipSaveImageToStream(image.GetPointer(), (IStream*)ref scope, &encoder, encoderParameters).ThrowIfFailed();
} finally {
scope.Dispose();
}
}
internal unsafe static void Save(this IImage image, MemoryStream stream)
{
Guid guid = default(Guid);
PInvokeCore.GdipGetImageRawFormat(image.GetPointer(), &guid).ThrowIfFailed();
Guid encoderClsid = ImageCodecInfoHelper.GetEncoderClsid(guid);
if (guid == PInvokeCore.ImageFormatJPEG || encoderClsid == Guid.Empty) {
guid = PInvokeCore.ImageFormatPNG;
encoderClsid = ImageCodecInfoHelper.GetEncoderClsid(guid);
}
image.Save(stream, encoderClsid, guid, null);
}
}
}