时内存制造设备上的位图 [英] Out of memory while creating bitmaps on device

查看:105
本文介绍了时内存制造设备上的位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

即时通讯有问题,高分辨率的图像。

im having problems with high resolution images.

即时通讯使用nodpi抽拉文件夹,1280×720的图像,并使用此code扩展它。

Im using nodpi-drawable folder for 1280x720 images, and using this code to scale it.

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; 
        }

我用code缩放图像筛选witdh所以如果屏幕分辨率320x480是图像将扩展到320,并保持比例,我不关心,如果图像从底部走出画面。

I use that code to scale images to screen witdh so if the screen is 320x480 the image will scale to 320 and keep proportions, i dont care if image go out of screen from bottom.

它的所有工作正常,但在xhdpi设备试图具体地说是三星Galaxy Note 2时正好720x1280的屏幕。

All its working fine, but when trying in a xhdpi device specifically a Samsung Galaxy Note 2 with a screen of exactly 720x1280.

据崩溃,内存溢出异常的行:

It crash with Out Of Memory Exception in the line:

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

我无法理解为什么,图像应进行调整,从720到720,但我的code必须是非常糟糕的优化或东西。

I cant understand why, the image should be scaled from 720 to 720 but my code must be really bad optimized or something.

我还没有试过1080x1920设备上,但现在看来,这将会崩溃了。

I havent tried on a 1080x1920 device but it seems it will crash too.

有人能看到一些不好的时候在看code?

Someone can see something bad when looking at the code?

推荐答案

使用这个方法来调整你的位图 -

use this method to resize your bitmap-

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

使用此认定中 -

use this Defination-

 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的德codeResource方法。

If you are using resource then replace method with BitmapFactory's decodeResource method..

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

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

这篇关于时内存制造设备上的位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆