0

この画像を表示してサーバーにアップロードしたい。

カメラアプリを使用して写真を撮り、写真のファイルパスをアクティビティに返しています。デバイス間でインポートしようとしている画像サイズが一定であるため、一部の電話でメモリ不足エラーが発生します。

電話のメモリ制限内で作業しながら、サーバーにアップロードできる最大の画像サイズを取得するにはどうすればよいですか?

コードは次のとおりです。

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

1 に答える 1

1

画像を保存するファイルを指す uri をカメラに与えることができます。

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

その後、そのファイルをサーバーにアップロードして、完全なビットマップ サイズを取得できます。一方、UI でビットマップ 1920x1920 (または類似のもの) をデコードして表示する必要はありません (多くのデバイスでは方法がありません)。大きすぎるだけです。

お役に立てれば。

于 2012-11-06T22:26:55.140 に答える