在上传之前处理位图大小

时间:2016-04-06 15:30:08

标签: android bitmap picasso

我让我的用户将图片从他们的Android图库上传到后端进行存储。

问题是,如果他们选择了一个肯定会产生OutOfMemory错误的巨大形象。我想用Bitmap做的就是确保它不会产生任何OOM错误。因此,只检查它是否太大,如果是这样,减小它的大小但保持纵横比,我不想裁掉照片的部分。 当我从后端下载图像时,它将通过毕加索并使用.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上的个人资料,其中所有图像都适合方形图像视图。

希望有人能从中理解并理解我想要实现的目标。提前致谢!

1 个答案:

答案 0 :(得分:1)

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