内存不足错误 - 位图大小

时间:2012-11-06 19:42:12

标签: android

我想显示此图片并将其上传到服务器。

我正在使用相机应用拍摄照片并将照片的文件路径返回到活动。我在某些手机上遇到Out of Memory错误,因为我有一个恒定的图像尺寸,我尝试在设备之间导入。

如何在仍然可以在手机的内存限制范围内工作的情况下,将可能的最大图像尺寸上传到服务器?

代码遵循:

请求加载Aync

GetBitmapTask GBT = new GetBitmapTask(dataType, path, 1920, 1920, loader);
GBT.addAsyncTaskListener(new AsyncTaskDone() 
{
    @Override
    public void loaded(Object resp) 
    {               
        crop.setImageBitmap((Bitmap)resp);
        crop.setScaleType(ScaleType.MATRIX);
    }

    @Override
    public void error() {
    }
});

GBT.execute();

抛出OOM错误的异步任务

public class GetBitmapTask extends AsyncTask<Void, Integer, Bitmap> 
{

 ...

@Override
public Bitmap doInBackground(Void... params) 
{
    Bitmap r = null;

    if (_dataType.equals("Unkown"))
    {
        Logger.e(getClass().getName(), "Error: Unkown File Type");
        return null;
    }
    else if (_dataType.equals("File")) 
    {   
        Options options = new Options();            
        options.inJustDecodeBounds = true;

        //Logger.i(getClass().getSimpleName(), _path.substring(7));

        BitmapFactory.decodeFile(_path.substring(7), options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        Logger.i(getClass().getSimpleName(), 
                "height: " + options.outHeight +
                "\nwidth: " + options.outWidth +
                "\nmimetype: " + options.outMimeType +
                "\nsample size: " + options.inSampleSize);

        options.inJustDecodeBounds = false;
        r = BitmapFactory.decodeFile(_path.substring(7), options);

    } 
    else if (_dataType.equals("Http")) 
    {
        r = _loader.downloadBitmap(_path, reqHeight);

        Logger.i(getClass().getSimpleName(), "height: " + r.getHeight() +
                                            "\nwidth: " + r.getWidth());
    }

    return r;
}

public static int calculateInSampleSize( Options options, int reqWidth, int reqHeight) 
{
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    while (height / inSampleSize > reqHeight || width / inSampleSize > reqWidth) 
    {
        if (height > width)
        {
            inSampleSize = height / reqHeight;
            if (((double)height % (double)reqHeight) != 0) 
            {
                inSampleSize++;
            }
        } 
        else 
        {
            inSampleSize = width / reqWidth;
            if (((double)width % (double)reqWidth) != 0) 
            {
                inSampleSize++;
            }
        }
    }
    return inSampleSize;
}
}

1 个答案:

答案 0 :(得分:1)

您可以将相机指向要将图像保存到文件的文件:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mDefaultPhotoUri); // set path to image file

然后,您可以将该文件上传到服务器,这样就可以获得完整的位图大小。另一方面,没有必要(并且在许多设备上没有办法)在UI中解码和显示位图1920x1920(或类似),它太大了。

希望这有帮助。