减少加载图像时间和RAM

时间:2013-02-03 15:43:43

标签: android bitmapfactory

我使用以下代码从库中加载一些位图:

 bitmap = (BitmapFactory.decodeFile(picturePath)).copy(Bitmap.Config.ARGB_8888, true);
 bitmap = Bitmap.createScaledBitmap(bitmap, screenWidth, screenHeight, true);
 bitmapCanvas = new Canvas(bitmap);
 invalidate(); // refresh the screen

问题:

通过首先完全解码并复制,然后进行缩放以适应屏幕宽度和高度,似乎需要很长时间来加载图像。它实际上并不需要以全密度加载图片,因为我不会让用户放大导入的图像。

这样,有没有减少加载时间和RAM的方法? (直接加载缩小的图像)如何进一步修改上面的编码?

2 个答案:

答案 0 :(得分:0)

如果您没有透明度,可能值得尝试使用RGB_565而不是ARGB_8888。

答案 1 :(得分:0)

刚刚找到了减少RAM和加载时间的答案,并避免了其他类似问题的outofmemory错误。

//get importing bitmap dimension
   Options op = new Options();
   op.inJustDecodeBounds = true;
   Bitmap pic_to_be_imported = BitmapFactory.decodeFile(picturePath, op);
   final int x_pic = op.outWidth;
   final int y_pic = op.outHeight;

//The new size we want to scale to
    final int IMAGE_MAX_SIZE= (int) Math.max(DrawViewWidth, DrawViewHeight);

    int scale = 1;
    if (op.outHeight > IMAGE_MAX_SIZE || op.outWidth > IMAGE_MAX_SIZE) 
    {
        scale = (int)Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / 
               (double) Math.max(op.outHeight, op.outWidth)) / Math.log(0.5)));
    }

    final BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;        

//Import the file using the o2 options: inSampleSized
    bitmap = (BitmapFactory.decodeFile(picturePath, o2));
    bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);