File: SkiaBitmapExportContext.cs
Web Access
Project: src\src\Graphics\src\Graphics.Skia\Graphics.Skia.csproj (Microsoft.Maui.Graphics.Skia)
using System.IO;
using SkiaSharp;
 
namespace Microsoft.Maui.Graphics.Skia
{
	public class SkiaBitmapExportContext : BitmapExportContext
	{
		private readonly bool _disposeBitmap;
 
		private SKBitmap _bitmap;
		private SKImage _image;
		private SKSurface _surface;
		private SKCanvas _skiaCanvas;
		private ScalingCanvas _canvas;
 
		public SkiaBitmapExportContext(
			int width,
			int height,
			float displayScale,
			int dpi = 72,
			bool disposeBitmap = true,
			bool transparent = true) : base(width, height, dpi)
		{
			if (transparent)
			{
				var imageInfo = new SKImageInfo(width, height, SKColorType.Rgba8888, SKAlphaType.Premul);
				_surface = SKSurface.Create(imageInfo);
			}
			else
			{
				var imageInfo = new SKImageInfo(width, height, SKColorType.Rgb565, SKAlphaType.Opaque);
				_surface = SKSurface.Create(imageInfo);
			}
 
			if (_surface == null)
			{
				System.Diagnostics.Debug.WriteLine("Unable to create a Skia surface");
				return;
			}
 
			_skiaCanvas = _surface.Canvas;
			var platformCanvas = new SkiaCanvas
			{
				Canvas = _skiaCanvas,
				DisplayScale = displayScale
			};
			_canvas = new ScalingCanvas(platformCanvas);
			_disposeBitmap = disposeBitmap;
		}
 
		public override ICanvas Canvas => _canvas;
 
		public override IImage Image => new SkiaImage(Bitmap);
 
		public SKImage SKImage => _image ?? (_image = _surface.Snapshot());
 
		public SKBitmap Bitmap
		{
			get
			{
				if (_bitmap == null)
				{
					var data = SKImage.Encode();
					_bitmap = SKBitmap.Decode(data);
				}
 
				return _bitmap;
			}
		}
 
		public override void Dispose()
		{
			if (_skiaCanvas != null)
			{
				_skiaCanvas.Dispose();
				_skiaCanvas = null;
			}
 
			if (_surface != null)
			{
				_surface.Dispose();
				_surface = null;
			}
 
			if (_image != null)
			{
				_image.Dispose();
				_image = null;
			}
 
			if (_bitmap != null && _disposeBitmap)
			{
				_bitmap.Dispose();
				_bitmap = null;
			}
 
			_canvas = null;
 
			base.Dispose();
		}
 
		public override void WriteToStream(Stream stream)
		{
			using (var data = SKImage.Encode(SKEncodedImageFormat.Png, 100))
			{
				data.SaveTo(stream);
			}
		}
	}
}