1

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

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

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

那么,如何实施某种检查并缩小该图像的大小,但仍能正确加载它?

我确实在加载图像后缩小图像,但这是应该在崩溃出现之前完成的事情。

肿瘤坏死因子。

           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();
            }
4

1 回答 1

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

于 2012-10-02T12:04:07.847 回答