我允许我的用户将图像从他们的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目标一起工作,但我相信你可以在没有它的情况下进行管理。