【问题标题】:Cannot convert bitmap to byte[]无法将位图转换为字节 []
【发布时间】:2018-09-06 21:09:33
【问题描述】:

所以我正在制作一个 Xamarin.Forms 应用程序。我有一个 StackLayout,我正在拍摄快照(只有元素,而不是整个屏幕。)

这是界面:

public interface IViewSnapShot
{
    Task<byte[]> CaptureAsync(Xamarin.Forms.View view);
}

这是事件:

private async Task SavePic_ClickedAsync(object sender, EventArgs e)
    {
        var imageByte = await DependencyService.Get<IViewSnapShot>().CaptureAsync(BlueprintSnapshot);
    }

这是特定于 Android 平台的:

public class MakeViewSnapshot : IViewSnapShot
{
    Task<byte[]> IViewSnapShot.CaptureAsync(Xamarin.Forms.View view)
    {
        var nativeView = view.GetRenderer().View;
        var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
        nativeView.DrawingCacheEnabled = true;
        nativeView.BuildDrawingCache(false);
        Bitmap bitmap = nativeView.GetDrawingCache(false);
        // TODO: Save bitmap and return filepath
        nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }
}

问题是bitmapData报错

无法将类型“byte[]”隐式转换为“System.Threading.Tasks.Task”

我有搜索互联网,每个帖子都说这是将位图转换为字节 [] 数组的方法。知道如何解决此错误吗?

稍后我想将 byte[] 数组上传到 web api。

【问题讨论】:

  • 你要么需要放弃你的任务返回签名,要么将方法包装在一个任务中
  • 为什么它被标记为异步但你返回一个字节[]?这就是问题所在,您应该返回一个任务,或者删除异步任务并只返回数据

标签: c# xamarin xamarin.forms bitmap xamarin.android


【解决方案1】:

您可以使用Task.FromResult() 将结果包装到Task 中,而不是返回byte[]

return Task.FromResult(bitmapData);

您的代码可能如下所示:

public class MakeViewSnapshot : IViewSnapShot
{
    Task<byte[]> IViewSnapShot.CaptureAsync(Xamarin.Forms.View view)
    {
        var nativeView = view.GetRenderer().View;
        var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
        nativeView.DrawingCacheEnabled = true;
        nativeView.BuildDrawingCache(false);
        Bitmap bitmap = nativeView.GetDrawingCache(false);
        // TODO: Save bitmap and return filepath
        nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return Task.FromResult(bitmapData);
    }
}

然后当你想得到CaptureAsync()返回的byte[]时,你只需要调用:

byte[] result = CaptureAsync(<Your_parameters>).Result;

【讨论】:

  • 你知道如何使用“GetRenderer”吗?找不到该方法,至少在最新的 xamarin 形式中,或者我缺少一些扩展类。非常感谢任何帮助
猜你喜欢
  • 2014-12-12
  • 2012-07-05
  • 1970-01-01
  • 2010-09-26
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多