android - 在设备上创建位图时内存不足

标签 android bitmap out-of-memory

我在处理高分辨率图像时遇到问题。

我将 nodpi-drawable 文件夹用于 1280x720 图像,并使用此代码对其进行缩放。

public static Drawable scaleDrawable(Drawable d, int width, Activity cxt)
    {
        BitmapDrawable bd = (BitmapDrawable)d;

        double oldWidth = bd.getBitmap().getWidth();
        double scaleFactor = width / oldWidth;

        int newHeight = (int) (d.getIntrinsicHeight() * scaleFactor);
        int newWidth = (int) (oldWidth * scaleFactor);

        Drawable drawable = new BitmapDrawable(cxt.getResources(),MainScreen.getResizedBitmap(bd.getBitmap(),newHeight,newWidth));

        BitmapDrawable bd2 = (BitmapDrawable)drawable;

        return  drawable;
    }

    public static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 

        int width = bm.getWidth(); 
        int height = bm.getHeight(); 

        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // create a matrix for the manipulation
        Matrix matrix = new Matrix();

        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

        return resizedBitmap; 
        }

我使用该代码将图像缩放到屏幕,所以如果屏幕是 320x480,图像将缩放到 320 并保持比例,我不关心图像是否从底部超出屏幕。

一切正常,但在 xhdpi 设备中尝试时,特别是屏幕正好为 720x1280 的 Samsung Galaxy Note 2。

它因行中的内存不足异常而崩溃:

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

我不明白为什么,图像应该从 720 缩放到 720,但我的代码一定是非常糟糕的优化之类的。

我还没有在 1080x1920 设备上试过,但它似乎也会崩溃。

有人看代码能看出不好的地方吗?

最佳答案

使用此方法调整位图大小-

 Bitmap bm=decodeSampledBitmapFromPath(src, reqWidth, reqHeight);

使用这个定义-

 public Bitmap decodeSampledBitmapFromPath(String path, int reqWidth,
    int reqHeight) {

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);

options.inSampleSize = calculateInSampleSize(options, reqWidth,
        reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(path, options);
return bmp;
}
}
  public int calculateInSampleSize(BitmapFactory.Options options,
    int reqWidth, int reqHeight) {

final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {
    if (width > height) {
        inSampleSize = Math.round((float) height / (float) reqHeight);
    } else {
        inSampleSize = Math.round((float) width / (float) reqWidth);
     }
 }
 return inSampleSize;
}

如果您正在使用资源,则将方法替换为 BitmapFactory 的 decodeResource 方法..

 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

....
.....
return BitmapFactory.decodeResource(res, resId, options);
}

关于android - 在设备上创建位图时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17990086/

相关文章:

android - 使用带有 Retrofit 的 Robospice 将图像上传到 Google appengine

android - 如何找出有多少空闲堆大小可用于 Android 2.* 的位图?

android - 将位图传递给另一个 Activity 以 RunTimeException 结束

c++ - C++ `new` 运算符可以在现实生活中抛出异常吗?

Android:奇怪的内存不足异常

java - 在 Libgdx 中使用 SQLite 数据库

android - 安装错误 : INSTALL_FAILED_INSUFFICIENT_STORAGE Android phonegap

c++ - 错误:arma::memory::acquire():Armadillo 内存不足

android - 显示在 android 中按下的隐藏 fragment onbackkey

android - 内存不足异常