如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将CString转换成wstring

如何将CSV格式转换成JSON格式

如何将CString转换成wstring

如何将DataGridView转换为DataTable?

如何将 UTC 时间转换为本地时间

手机如何将照片转换为pdf