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);
}
}
试图添加评论,但这太长了。我认为你有一些问题:
实际上,从根本上说,你的代码没有意义。看起来你试图通过Intent传递一个Bitmap,只是为了将它转换回一个字节数组。只需传递Intent中的字节数组。
即使忽略了上述内容,您还是会尝试这样做。
mBitMap = (Bitmap)data.Extras.Get("data");
根本不应该工作。事实上,我很惊讶它不会在这里抛出运行时异常。你不能只是向一个Intent添加一个Bitmap,所以尽管Intent.Extras.Get返回一个对象,如果你只是尝试将它转换为Bitmap,它应该总是抛出一个异常。您也不能只将一个字节数组转换为Bitmap。如果要通过Intent传递位图,首先应将其转换为字节数组,然后将其添加到意图中。另一方面,从Intent获取字节数组并将其转换为Bitmap。
可以通过intent传递的数据量也有限制。 Google没有指定它可以容纳多少数据,因为它取决于许多因素(如堆大小),但假设它小于500kb。规则是,保持您传递的数据量很小。如果位图很小,就像一个图标,那么你就可以了,但如果它太大你会得到一个例外。
MemoryStream还将根据许多因素(包括分配的堆大小)来限制数据,因此,如果您处理大量数据,这很容易成为问题。如果您正在使用具有大型数据集的流,请使用自动实现缓冲的类或自行实现它。
最后,要注意无论如何都要传递Bitmaps。它们占用了大量内存,您必须非常小心,不要通过引用创建内存泄漏。在完成它们之后,请记住处理位图并删除对意图两侧的所有引用(或使用弱引用)。
如果Bitmap很大,是持久的,或者你有多个,你应该考虑将它写入文件系统然后检索它,尽管再次记得处理你拥有的任何位图并删除对它们的所有引用。