Xamarin Forms(Android)修改默认图片文件夹及大图处理方案咨询
解决“Canvas Drawing too large bitmaps”错误的两个方案
1. 指定动态导入图片的存储文件夹
drawable是APK编译打包时的资源目录,动态导入的图片无法直接存入该目录。你需要将图片保存到应用的内部私有存储或外部存储的指定文件夹,后续从该路径加载图片即可。
代码修改示例
var file = new SmbFile(path, auth); try { if (file.Exists()) { var readStream = file.GetInputStream(); MemoryStream memStream = new MemoryStream(); ((Stream)readStream).CopyTo(memStream); byte[] imageBytes = memStream.ToArray(); // 定义存储目录(示例:内部存储的app_images文件夹) string storageDir = Path.Combine(Android.App.Application.Context.FilesDir.AbsolutePath, "app_images"); Directory.CreateDirectory(storageDir); // 确保目录存在 // 生成唯一文件名避免冲突 string fileName = $"product_{Guid.NewGuid()}.jpg"; string filePath = Path.Combine(storageDir, fileName); // 保存图片到指定文件夹 File.WriteAllBytes(filePath, imageBytes); // 从指定路径加载图片 if (new FileInfo(filePath).Length < 120188100) { ProductImage = ImageSource.FromFile(filePath); readStream.Dispose(); InfoColSpan = 1; } else { Common.AlertError("图片过大,无法显示"); } } } catch (Exception ex) { // 处理存储或加载异常 }
2. 精准判断图片是否过大并拒绝加载
仅通过文件大小判断并不准确——相同文件大小的图片,分辨率、色彩格式不同,内存占用差异极大。正确做法是先解码图片的宽高信息,计算其加载到内存后的实际占用,再决定是否加载。
代码修改示例
var file = new SmbFile(path, auth); try { if (file.Exists()) { var readStream = file.GetInputStream(); MemoryStream memStream = new MemoryStream(); ((Stream)readStream).CopyTo(memStream); byte[] imageBytes = memStream.ToArray(); // 仅解码图片宽高,不加载完整Bitmap到内存 var options = new Android.Graphics.BitmapFactory.Options(); options.InJustDecodeBounds = true; Android.Graphics.BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length, options); // 计算内存占用(按ARGB_8888格式,每个像素占4字节) long memorySize = options.OutWidth * options.OutHeight * 4; // 设置内存阈值(示例:50MB,可根据设备性能调整) long maxAllowedMemory = 50 * 1024 * 1024; if (memorySize < maxAllowedMemory) { ProductImage = ImageSource.FromStream(() => new MemoryStream(imageBytes)); readStream.Dispose(); InfoColSpan = 1; } else { Common.AlertError("图片分辨率过高,无法显示"); } } } catch (Exception ex) { // 处理解码或加载异常 }
关键说明
InJustDecodeBounds = true让BitmapFactory仅解析图片的宽高元数据,不会占用大量内存,避免提前触发内存溢出。- 内存计算需匹配图片实际色彩格式,比如RGB_565格式每个像素占2字节,需调整计算逻辑。
内容的提问来源于stack exchange,提问作者Elgate
相关产品推荐
相关产品推荐

