上传前处理位图大小



我允许我的用户将图像从他们的android Gallery上传到后端进行存储。

问题是,如果他们选择了一个巨大的图像,这肯定会产生OutOfMemory故障。我想对位图做的就是确保它不会产生任何OOM错误。所以只检查它是否太大,如果是,缩小它的尺寸,但保持纵横比,我不想剪掉照片的部分。当我从后端下载回图像时,它将通过picasso并使用.centerCrop()和.fit()将其裁剪到图像视图中。

首先,这里是从图库接收数据的活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if(resultCode == RESULT_OK){
        if(requestCode == SELECT_PICTURE){
            Uri selectedImage = data.getData();
            if(!image1_exists){
                attachImage(image1,selectedImage);
            }
        }
    }
}

接下来,我将选择的图像显示在"图库"布局中:

public void attachImage(ImageView image, Uri uri){
    Picasso.with(this).load(uri).resize(500,500).into(mTarget);
    Picasso.with(this).load(uri).centerCrop().fit().into(image);
}

因此,一个Picasso实例正在显示他们选择的图像,另一个应该调整uri数据的大小,以防它太大(这是我需要完全更改的部分),进入目标:

final Target mTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) {
        image_scaled = Bitmap.createScaledBitmap(bitmap, 500,500 * bitmap.getHeight() / bitmap.getWidth(), false);
        if(!image1_exists){
            uploadImage(image_scaled,"image1");
        }
    }
    @Override
    public void onBitmapFailed(Drawable drawable) {
        Log.d("DEBUG", "onBitmapFailed");
    }
    @Override
    public void onPrepareLoad(Drawable drawable) {
        Log.d("DEBUG", "onPrepareLoad");
    }
};

在这里,我还想(正如你所看到的)缩放位图以减小大小并节省后端的存储空间。但是要保持纵横比,不要剪掉图像的任何部分。我想这可能没有必要,因为我无论如何都要做一些类似于大图像的事情?如果你需要知道这些图像的布局如何,想象一下Instagram上的个人资料,所有图像都可以放在方形图像视图中。

希望有人能从中得到一些理解,并理解我正在努力实现的目标。提前感谢!

我已经使用这个位图解码选项完成了这项工作。使用此方法解码位图将对其进行下采样,从而减少设备上占用的内存。不幸的是,你只能在解码位图时应用它,所以这意味着它不能与Picasso目标一起工作,但我相信你可以在没有它的情况下进行管理。

最新更新