protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == Android.App.Result.Ok && data != null)
{
mBitMap = (Bitmap)data.Extras.Get("data");
imageView.SetImageBitmap(mBitMap);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
bitmapData = stream.ToArray();
}
content = new ByteArrayContent(bitmapData);
}
}
答案 0 :(得分:0)
试图添加评论,但这太长了。我认为您有一些问题:
实际上,从根本上讲,您的代码没有意义。看起来您正在尝试通过Intent传递位图,只是将其转换回字节数组。只需在Intent中传递字节数组即可。
即使忽略上述内容,您在尝试执行此操作时还有其他问题。
mBitMap = (Bitmap)data.Extras.Get("data");
根本不起作用。实际上,我很惊讶它没有在此处引发运行时异常。您不能只是将位图添加到Intent,所以尽管Intent.Extras.Get返回一个对象,但是如果您尝试将其强制转换为位图,则它应始终引发异常。您也不能只将字节数组转换为位图。如果要通过意图传递位图,则应首先将其转换为字节数组,然后将其添加到意图中。另一方面,从Intent获取字节数组并将其转换为Bitmap。
通过意图可以传递的数据量也受到限制。 Google并未指定可容纳多少数据,因为它取决于许多因素(例如堆大小),但假定它小于500kb。规则是,保持传递的数据量较小。如果位图很小(如图标),则可以,但是如果位图太大,则会出现异常。
MemoryStream还将基于包括分配的堆大小在内的许多因素来限制数据,因此,如果要处理大量数据,这很容易成为问题。如果您使用的是具有大数据集的流,请使用自动实现缓冲的类,也可以使用自己实现的类。
最后,请注意无论如何传递位图。它们占用大量内存,您必须非常小心,以免通过引用造成内存泄漏。完成位图后,请记住要在意图的两侧丢弃位图并删除对其的所有引用(或使用“弱引用”)。
如果位图很大,很持久,或者您有多个位图,则应考虑将其写入文件系统,然后再检索它,不过再次记住,请处置掉所有位图并删除对其的所有引用。 / p>