Merge pull request #4 from DarthAffe/ImageLoading

Reduced allocations on image-conversion if the source image is already
This commit is contained in:
DarthAffe 2024-08-11 20:24:39 +02:00 committed by GitHub
commit 3f4c7abdfe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 7 deletions

View File

@ -21,7 +21,8 @@ public static class ImageExtension
SKBitmap bitmap = new(image.Width, image.Height, SKColorType.Bgra8888, SKAlphaType.Unpremul); SKBitmap bitmap = new(image.Width, image.Height, SKColorType.Bgra8888, SKAlphaType.Unpremul);
nint pixelPtr = bitmap.GetPixels(out nint length); nint pixelPtr = bitmap.GetPixels(out nint length);
image.ConvertTo<ColorBGRA>().CopyTo(new Span<byte>((void*)pixelPtr, (int)length));
(image as IImage<ColorBGRA> ?? image.ConvertTo<ColorBGRA>()).CopyTo(new Span<byte>((void*)pixelPtr, (int)length));
return bitmap; return bitmap;
} }
@ -32,9 +33,9 @@ public static class ImageExtension
return skImage.Encode(SKEncodedImageFormat.Png, 100).ToArray(); return skImage.Encode(SKEncodedImageFormat.Png, 100).ToArray();
} }
public static IImage ToImage(this SKImage skImage) => SKBitmap.FromImage(skImage).ToImage(); public static IImage<ColorBGRA> ToImage(this SKImage skImage) => SKBitmap.FromImage(skImage).ToImage();
public static IImage ToImage(this SKBitmap bitmap) public static IImage<ColorBGRA> ToImage(this SKBitmap bitmap)
{ {
ArgumentNullException.ThrowIfNull(bitmap, nameof(bitmap)); ArgumentNullException.ThrowIfNull(bitmap, nameof(bitmap));

View File

@ -18,10 +18,10 @@ public static class ImageExtension
Bitmap bitmap = new(image.Width, image.Height, PixelFormat.Format24bppRgb); 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); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
IImage<ColorBGR> convertedImage = image.ConvertTo<ColorBGR>(); IImage<ColorBGR> img = image as IImage<ColorBGR> ?? image.ConvertTo<ColorBGR>();
nint ptr = bmpData.Scan0; nint ptr = bmpData.Scan0;
foreach (ImageRow<ColorBGR> row in convertedImage.Rows) foreach (ImageRow<ColorBGR> row in img.Rows)
{ {
row.CopyTo(new Span<byte>((void*)ptr, bmpData.Stride)); row.CopyTo(new Span<byte>((void*)ptr, bmpData.Stride));
ptr += bmpData.Stride; ptr += bmpData.Stride;
@ -37,10 +37,10 @@ public static class ImageExtension
Bitmap bitmap = new(image.Width, image.Height, PixelFormat.Format32bppArgb); 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); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
IImage<ColorBGRA> convertedImage = image.ConvertTo<ColorBGRA>(); IImage<ColorBGRA> img = image as IImage<ColorBGRA> ?? image.ConvertTo<ColorBGRA>();
nint ptr = bmpData.Scan0; nint ptr = bmpData.Scan0;
foreach (ImageRow<ColorBGRA> row in convertedImage.Rows) foreach (ImageRow<ColorBGRA> row in img.Rows)
{ {
row.CopyTo(new Span<byte>((void*)ptr, bmpData.Stride)); row.CopyTo(new Span<byte>((void*)ptr, bmpData.Stride));
ptr += bmpData.Stride; ptr += bmpData.Stride;