如何将 SkiaSharp.SkBitmap 转换为 Android.Graphics.Bitmap?
Posted
技术标签:
【中文标题】如何将 SkiaSharp.SkBitmap 转换为 Android.Graphics.Bitmap?【英文标题】:How to convert SkiaSharp.SkBitmap to Android.Graphics.Bitmap? 【发布时间】:2019-12-12 17:20:22 【问题描述】:我想将PinBitmap
(SkiaSharp.SkBitmap
) 转换为android.Graphics.Bitmap
。网上找不到参考资料,我只在Android项目中试过这个:
Android.Graphics.Bitmap bitmap = BitmapFactory.DecodeByteArray(myView.PinBitmap.Bytes, 0, myView.PinBitmap.Bytes.Length);
但bitmap
为空。
我正在从 SKCanvasView 创建PinBitmap
:
private void SKCanvasView_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
var surface = e.Surface;
var canvas = surface.Canvas;
SKImageInfo info = e.Info;
canvas.DrawLine(10, 10, 10, 200, new SKPaint() IsStroke = true, Color = SKColors.Green, StrokeWidth = 10 );
SKBitmap saveBitmap = new SKBitmap();
// Create bitmap the size of the display surface
if (saveBitmap == null)
saveBitmap = new SKBitmap(info.Width, info.Height);
// Or create new bitmap for a new size of display surface
else if (saveBitmap.Width < info.Width || saveBitmap.Height < info.Height)
SKBitmap newBitmap = new SKBitmap(Math.Max(saveBitmap.Width, info.Width),
Math.Max(saveBitmap.Height, info.Height));
using (SKCanvas newCanvas = new SKCanvas(newBitmap))
newCanvas.Clear();
newCanvas.DrawBitmap(saveBitmap, 0, 0);
saveBitmap = newBitmap;
// Render the bitmap
canvas.Clear();
canvas.DrawBitmap(saveBitmap, 0, 0);
var customPin = new CustomPin PinBitmap = saveBitmap ;
Content = customPin;
【问题讨论】:
您确定 PinBitmap 中的数据是有效的并且是 Android.Graphics.Bitmap 支持的图像格式吗? 我不确定它是否有效,但我关注this doc 将SKCanvasView
保存到Bitmap
您可能应该花时间验证数据,然后再浪费数小时调试错误的问题。
如何验证Bitmap的数据?
将其写入文件并使用图像编辑器进行验证。
【参考方案1】:
这很容易做到,您只需要拥有 SkiaSharp.Views NuGet 安装包。然后,还有扩展方法:
skiaBitmap = androidBitmap.ToSKBitmap(); androidBitmap = skiaBitmap.ToBitmap();
还有一些其他的,比如:ToSKImage 和 ToSKPixmap。
注意:这些都会复制像素数据。为避免内存问题, 您可以在方法返回后立即处理原始文件。
来源:https://forums.xamarin.com/discussion/comment/294868/#Comment_294868
【讨论】:
【参考方案2】:我想将 PinBitmap (SkiaSharp.SkBitmap) 转换为 Android.Graphics.Bitmap
在Android MainActivity中,你可以使用AndroidExtensions.ToBitmap
方法将PinBitmap转换为Bitmap。
AndroidExtensions.ToBitmap
方法:https://docs.microsoft.com/en-us/dotnet/api/skiasharp.views.android.androidextensions.tobitmap?view=skiasharp-views-1.68.1
从 NuGet 包安装 SkiaSharp.Views.Forms
。 https://www.nuget.org/packages/SkiaSharp.Views.Forms/
使用参考。
using SkiaSharp.Views.Android;
使用下面的代码。
var bitmap = AndroidExtensions.ToBitmap(PinBitmap);
【讨论】:
以上是关于如何将 SkiaSharp.SkBitmap 转换为 Android.Graphics.Bitmap?的主要内容,如果未能解决你的问题,请参考以下文章