时间:2022-12-24 13:52:20 | 栏目:Android代码 | 点击:次
使用方法BitmapFactory.decodeFile转化Bitmap时报错:java.lang.RuntimeException: Canvas: trying to draw too large(120422400bytes) bitmap.
报错原因:图片转化为Bitmap超过最大值MAX_BITMAP_SIZE
frameworks/base/graphics/java/android/graphics/RecordingCanvas.java public static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB /** @hide */ @Override protected void throwIfCannotDraw(Bitmap bitmap) { super.throwIfCannotDraw(bitmap); int bitmapSize = bitmap.getByteCount(); if (bitmapSize > MAX_BITMAP_SIZE) { throw new RuntimeException( "Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap."); } }
修改如下
//修改前 Bitmap image = BitmapFactory.decodeFile(filePath); imageView.setImageBitmap(image); //修改后 import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.DisplayMetrics; File file = new File(filePath); if (file.exists() && file.length() > 0) { //获取设备屏幕大小 DisplayMetrics dm = getResources().getDisplayMetrics(); int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; //获取图片宽高 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); float srcWidth = options.outWidth; float srcHeight = options.outHeight; //计算缩放比例 int inSampleSize = 1; if (srcHeight > screenHeight || srcWidth > screenWidth) { if (srcWidth > srcHeight) { inSampleSize = Math.round(srcHeight / screenHeight); } else { inSampleSize = Math.round(srcWidth / screenWidth); } } options.inJustDecodeBounds = false; options.inSampleSize = inSampleSize; Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); imageView.setImageBitmap(bitmap); }
相关参考:
Android 图片缓存之 Bitmap 详解
https://juejin.cn/post/6844903442939412493
BitmapFactory
https://developer.android.com/reference/android/graphics/BitmapFactory.html
BitmapFactory.options
BitmapFactory.Options类是BitmapFactory对图片进行解码时使用的一个配置参数类,其中定义了一系列的public成员变量,每个成员变量代表一个配置参数。
https://blog.csdn.net/showdy/article/details/54378637