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

我有高分辨率图像的问题.

我使用nodpi-drawable文件夹为1280×720图像,并使用此代码来缩放它.

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,width,height,matrix,false);

        return resizedBitmap; 
        }

我使用该代码将图像缩放到屏幕,所以如果屏幕是320×480,图像将缩放到320并保持比例,我不在乎图像是否从底部离开屏幕.

所有它的工作正常,但尝试在xhdpi设备特别是三星Galaxy Note 2与屏幕正好720×1280.

它在行中出现Out of Memory Exception崩溃:

Bitmap resizedBitmap = Bitmap.createBitmap(bm,false);

我不明白为什么,图像应该从720到720,但我的代码必须是非常糟糕的优化或其他东西.

我没有试过1080×1920设备,但它似乎也会崩溃.

在查看代码时,有人会看到一些不好的东西吗?

解决方法

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

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,reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(path,options);
return bmp;
}
}
  public int calculateInSampleSize(BitmapFactory.Options options,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 reqHeight) {

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

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...