在加载到内存之前检查Android图像大小

时间:2012-10-02 11:57:10

标签: android

我创建了一个小应用程序,可以处理来自图库或相机的图像。

一切正常,但是。 在小屏幕和小内存大小的设备上(HTC Desire)我从其他手机上下载了一些全尺寸的图像,它们要大得多(手机上的800万像素摄像头)。

如果我尝试加载它,对于我的小相机巨大的图像,它会立即崩溃。

那么,如何实现某种检查并缩小图像尺寸,但仍能正确加载?

我会在加载后缩小图像,但这应该在崩溃出现之前完成。

TNX。

           InputStream in = null;
            try {
                in = getContentResolver().openInputStream(data.getData());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // get picture size.
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(in, null, options);
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // resize the picture for memory.
            int screenH = getResources().getDisplayMetrics().heightPixels; //800
            int screenW = getResources().getDisplayMetrics().widthPixels; //480
            int width = options.outWidth / screenW;
            int height = options.outHeight / screenH;

            Log.w("Screen Width", Integer.toString(width));
            Log.w("Screen Height", Integer.toString(height));

            int sampleSize = Math.max(width, height);
            options.inSampleSize = sampleSize;
            options.inJustDecodeBounds = false;
            try {
                in = getContentResolver().openInputStream(data.getData());
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // convert to bitmap with declared size.
            Globals.INSTANCE.imageBmp = BitmapFactory.decodeStream(in, null, options);
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

1 个答案:

答案 0 :(得分:1)

只需设置

,就可以避免在内存中加载位图
inJustDecodeBounds = true

inJustDecodeBounds将允许您仅解码图像的边界而不对其进行解码。给定位图的heightwidth,您可以使用下采样。

inSampleSize

当文档停留时

  

如果设置为值> 1,请求解码器对原始进行二次采样   图像,返回较小的图像以节省内存。

int tmpWidth = bitmapWidth;
int tmpHeight = bitmapHeigth;
int requiredSize = ...
while (true) {
 if (tmpWidth / 2 < requiredSize
    || tmpHeight / 2 < requiredSize)
        break;
    tmpWidth /= 2;
    tmpHeight /= 2;
    ratio *= 2;
 }

编辑:对于32位Bitmap,所需的内存为width * height * 4