From 0a731b5ca4f90f7d3b44d535091b0594e15d1b06 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sun, 14 Jul 2024 22:51:10 +0200 Subject: [PATCH] Added ToBitmap nad ToBmp extensions for image --- HPPH.System.Drawing/ImageExtension.cs | 57 ++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/HPPH.System.Drawing/ImageExtension.cs b/HPPH.System.Drawing/ImageExtension.cs index c98f412..e887302 100644 --- a/HPPH.System.Drawing/ImageExtension.cs +++ b/HPPH.System.Drawing/ImageExtension.cs @@ -6,9 +6,62 @@ namespace HPPH.System.Drawing; public static class ImageExtension { - public static Bitmap ToBitmap(this IImage image) + [SupportedOSPlatform("windows")] + public static unsafe Bitmap ToBitmap(this IImage image) { - throw new NotImplementedException(); + switch (image.ColorFormat.BytesPerPixel) + { + case 3: + { + Bitmap bitmap = new(image.Width, image.Height, PixelFormat.Format24bppRgb); + BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); + + IImage convertedImage = image.ConvertTo(); + + nint ptr = bmpData.Scan0; + foreach (ImageRow row in convertedImage.Rows) + { + row.CopyTo(new Span((void*)ptr, bmpData.Stride)); + ptr += bmpData.Stride; + } + + bitmap.UnlockBits(bmpData); + + return bitmap; + } + + case 4: + { + Bitmap bitmap = new(image.Width, image.Height, PixelFormat.Format32bppArgb); + BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); + + IImage convertedImage = image.ConvertTo(); + + nint ptr = bmpData.Scan0; + foreach (ImageRow row in convertedImage.Rows) + { + row.CopyTo(new Span((void*)ptr, bmpData.Stride)); + ptr += bmpData.Stride; + } + + bitmap.UnlockBits(bmpData); + + return bitmap; + } + + default: + throw new NotSupportedException($"Unsupported color format '{image.ColorFormat}'."); + } + } + + [SupportedOSPlatform("windows")] + public static byte[] ToPng(this IImage image) + { + using Bitmap bitmap = ToBitmap(image); + using MemoryStream ms = new(); + bitmap.Save(ms, ImageFormat.Png); + + return ms.ToArray(); } [SupportedOSPlatform("windows")]