如何在加载到 ImageView 之前调整图像大小以避免 OOM 问题
How to resize image before loading to ImageView to avoid OOM issues
如何在从 gallery/photos 中选择后加载到图像视图之前调整图像大小?否则大图像会导致 OOM 问题。
SelectImageGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image From Gallery"), 1);
}
}
Uri uri = I.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
尝试:
Bitmap resized_Bitmap = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
imageView.setImageBitmap( resized_Bitmap);
参考this回答
您可以像这样调整位图大小
import android.graphics.Matrix
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
当您遇到 OOM 问题时,您可以通过
解决此问题
1) 减小位图大小并且
2) 通过更改 gradle.properties 和 AndroidManifest 文件
来增加应用程序的大小
gradle.properties
org.gradle.jvmargs=-Xmx1536m
Android 清单 android:largeHeap="true", android:hardwareAccelerated="true"
为了以后可能需要的人,我终于用如下的glide来解决了。
选择意图
SelectImageGallery1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image1 From Gallery"), 1);
}
}
使用 Glide 将图像设置为 Imageview
@Override
protected void onActivityResult(int RC, int RQC, Intent I) {
super.onActivityResult(RC, RQC, I);
if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.asBitmap()
.load(uri)
.centerInside()
.into(new CustomTarget<Bitmap>(512, 512) {
@Override
public void onResourceReady(@NonNull Bitmap bitmap1, @Nullable Transition<? super Bitmap> transition) {
imageView1.setImageBitmap(bitmap1);
MainActivity.this.bitmap1 = bitmap1;
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
如何在从 gallery/photos 中选择后加载到图像视图之前调整图像大小?否则大图像会导致 OOM 问题。
SelectImageGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image From Gallery"), 1);
}
}
Uri uri = I.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
尝试:
Bitmap resized_Bitmap = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
imageView.setImageBitmap( resized_Bitmap);
参考this回答
您可以像这样调整位图大小
import android.graphics.Matrix
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
当您遇到 OOM 问题时,您可以通过
解决此问题1) 减小位图大小并且
2) 通过更改 gradle.properties 和 AndroidManifest 文件
来增加应用程序的大小gradle.properties org.gradle.jvmargs=-Xmx1536m
Android 清单 android:largeHeap="true", android:hardwareAccelerated="true"
为了以后可能需要的人,我终于用如下的glide来解决了。 选择意图
SelectImageGallery1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image1 From Gallery"), 1);
}
}
使用 Glide 将图像设置为 Imageview
@Override
protected void onActivityResult(int RC, int RQC, Intent I) {
super.onActivityResult(RC, RQC, I);
if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
Uri uri = I.getData();
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_background);
Glide.with(this)
.setDefaultRequestOptions(options)
.asBitmap()
.load(uri)
.centerInside()
.into(new CustomTarget<Bitmap>(512, 512) {
@Override
public void onResourceReady(@NonNull Bitmap bitmap1, @Nullable Transition<? super Bitmap> transition) {
imageView1.setImageBitmap(bitmap1);
MainActivity.this.bitmap1 = bitmap1;
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}