Xam.Media.Plugin位图太大而无法上传到纹理中

时间:2016-09-22 14:36:15

标签: android xamarin.android xamarin.forms

我在我的Xamarin表单应用中使用了优秀的Xam.Plugin.Media nuget包来允许用户拍照。我已经关注了Xam.Plugin.Media github页面中的示例代码:

takePhoto.Clicked += async (sender, args) =>
{
await CrossMedia.Current.Initialize();

if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
    DisplayAlert("No Camera", ":( No camera available.", "OK");
    return;
}

var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
    Directory = "Sample",
    Name = "test.jpg"
});

if (file == null)
    return;

await DisplayAlert("File Location", file.Path, "OK");

image.Source = ImageSource.FromStream(() =>
{
    var stream = file.GetStream();
    file.Dispose();
    return stream;
}); 
};

然而,这在Android上失败并显示错误消息:

  

位图太大而无法上传到纹理中(5312x2988,max = 4096x4096)

这有什么办法吗?理想情况下使用PCL位图库

1 个答案:

答案 0 :(得分:1)

android使用位图根据显示分辨率和密度调整图像大小。 您必须将其缩小到您想要的大小。您可以编写自己的位图工厂来执行此操作。 或者您可以使用FFImageLoading进行下采样。 或者使用图像变换并实际上完全调整图像大小。

<ffimageloading:CachedImage HorizontalOptions="Center" VerticalOptions="Center"
            WidthRequest="300" HeightRequest="300"
            DownsampleToViewSize="true"
            Source = "http://loremflickr.com/600/600/nature?filename=simple.jpg" />

参考文献:

  1. Xamarin.Forms API
  2. Downsampling properties
  3. GetImageAsJpgAsync(int quality = 90, int desiredWidth = 0, int desiredHeight = 0)
  4. GetImageAsPngAsync(int desiredWidth = 0, int desiredHeight = 0)