当前位置:主页 > 移动开发 > Android代码 >

解决Android BitmapFactory的基本使用问题

时间: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

您可能感兴趣的文章:

相关文章