出现记忆错误 - 位图大小



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

我正在使用相机应用程序拍照,并将照片的文件路径返回到活动中。我在某些手机上遇到了内存错误,因为我有一个恒定的图像大小,我尝试在设备之间导入。

如何在仍在手机的内存约束中工作时,如何拉出可能上传到服务器的最大图像大小?

代码如下:

请求加载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;
}
}

您可以将摄像机指向您要将图像保存到:

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

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

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新