我让我的用户从他们的安卓画廊上传图片到后端存储。
问题是,如果他们选择一个巨大的图像,这肯定会产生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数据的大小,以防它太大(这是我需要完全更改的部分),将其转换为Target:
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上的个人资料,其中所有的图像都符合一个方形的图像视图。
希望有人能理解这件事,理解我想要实现的目标。提前感谢!
发布于 2016-04-06 15:51:40
我使用这位图解码选项完成了这一操作。使用此方法解码位图,将降低采样,从而减少设备上占用的内存。不幸的是,您只能在解码位图时应用它,因此这意味着它不能与Picasso目标一起工作,但是我相信没有它您可以处理。
https://stackoverflow.com/questions/36455675
复制相似问题