using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using SkiaSharp; using CPF.Drawing; namespace CPF.Skia { public class SkiaBitmap : IBitmapImpl { public SkiaBitmap(SKBitmap bitmap) { if (bitmap == null) { throw new Exception("创建位图失败"); } this.bitmap = bitmap; } SKBitmap bitmap; public int Width { get { return bitmap.Width; } } public int Height { get { return bitmap.Height; } } public SKBitmap Bitmap { get { return bitmap; } } //public void CopyToIntptr(IntPtr intPtr) //{ //} ~SkiaBitmap() { Dispose(); } public void Dispose() { if (bitmap != null) { bitmap.Dispose(); bitmap = null; } GC.SuppressFinalize(this); } public IBitmapLockImpl Lock() { //bitmap.LockPixels(); return new SkiaBitmapLock(bitmap); } //public void SaveToFile(string fileName, ImageFormat format) //{ // var f = SKEncodedImageFormat.Jpeg; // switch (format) // { // case ImageFormat.Bmp: // f = SKEncodedImageFormat.Bmp; // break; // case ImageFormat.Gif: // f = SKEncodedImageFormat.Gif; // break; // case ImageFormat.Jpeg: // f = SKEncodedImageFormat.Jpeg; // break; // case ImageFormat.Png: // f = SKEncodedImageFormat.Png; // break; // default: // break; // } // var stream = new SKFileWStream(fileName); // SKPixmap.Encode(stream, bitmap, f, 100); // //stream.Flush(); // stream.Dispose(); //} public Stream SaveToStream(ImageFormat format) { var f = SKEncodedImageFormat.Jpeg; switch (format) { case ImageFormat.Bmp: f = SKEncodedImageFormat.Bmp; break; case ImageFormat.Gif: f = SKEncodedImageFormat.Gif; break; case ImageFormat.Jpeg: f = SKEncodedImageFormat.Jpeg; break; case ImageFormat.Png: f = SKEncodedImageFormat.Png; break; default: break; } var m = new MemoryStream(); var stream = new SKManagedWStream(m); SKPixmap.Encode(stream, bitmap, f, 100); stream.Dispose(); m.Position = 0; return m; } public void SaveToStream(ImageFormat format, Stream m) { var f = SKEncodedImageFormat.Jpeg; switch (format) { case ImageFormat.Bmp: f = SKEncodedImageFormat.Bmp; break; case ImageFormat.Gif: f = SKEncodedImageFormat.Gif; break; case ImageFormat.Jpeg: f = SKEncodedImageFormat.Jpeg; break; case ImageFormat.Png: f = SKEncodedImageFormat.Png; break; default: break; } //var m = new MemoryStream(); var stream = new SKManagedWStream(m); SKPixmap.Encode(stream, bitmap, f, 100); stream.Dispose(); //return m; } public object Clone() { return new SkiaBitmap(bitmap.Copy()); } } }