Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在加载到ImageView之前调整图像大小以避免OOM问题_Java_Android_Imagebitmap - Fatal编程技术网

Java 如何在加载到ImageView之前调整图像大小以避免OOM问题

Java 如何在加载到ImageView之前调整图像大小以避免OOM问题,java,android,imagebitmap,Java,Android,Imagebitmap,从gallery/photos中选择后,如何在加载到imageview之前调整图像大小?。否则,大型图像会导致OOM问题 SelectImageGallery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setType("image/*")

从gallery/photos中选择后,如何在加载到imageview之前调整图像大小?。否则,大型图像会导致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);
    }
}
尝试:

尝试:

参考答案

您可以像这样调整位图的大小

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;
}
参考答案

您可以像这样调整位图的大小

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”

当您面临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) {
                        }
                    });
        }
@覆盖
活动结果上的受保护无效(int RC、int RQC、Intent I){
super.onActivityResult(RC、RQC、I);
如果(RC==1&&RQC==RESULT\u OK&&I!=null&&I.getData()!=null){
Uri=I.getData();
RequestOptions=newrequestoptions()
.format(DecodeFormat.preference_RGB_565)
.占位符(R.drawable.ic_启动器_背景)
.错误(R.drawable.ic_启动器_后台);
用(这个)滑翔
.setDefaultRequestOptions(选项)
.asBitmap()
.load(uri)
.centerInside()
.into(新的CustomTarget(512、512){
@凌驾

public void onResourceReady(@NonNull Bitmap bitmap1,@Nullable Transition我最终使用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) {
                        }
                    });
        }
@覆盖
活动结果上的受保护无效(int RC、int RQC、Intent I){
super.onActivityResult(RC、RQC、I);
如果(RC==1&&RQC==RESULT\u OK&&I!=null&&I.getData()!=null){
Uri=I.getData();
RequestOptions=newrequestoptions()
.format(DecodeFormat.preference_RGB_565)
.占位符(R.drawable.ic_启动器_背景)
.错误(R.drawable.ic_启动器_后台);
用(这个)滑翔
.setDefaultRequestOptions(选项)
.asBitmap()
.load(uri)
.centerInside()
.into(新的CustomTarget(512、512){
@凌驾

公共资源就绪(@NonNull Bitmap bitmap1,@Nullable transitionhamk you@anehme。不幸的是,它在加载到imageViewThamk you@anehme之前没有调整大小。不幸的是,它在加载到imageViewThamk you@anehme之前没有调整大小。这是否回答了您的问题?谢谢@MahmoudAbuElheja。我如何在代码中实现这一点?这回答了您的问题吗?谢谢@MahmoudAbuEl呵呵。我该如何在代码中实现这一点谢谢@webaddicted我知道android:largeHeap=“true”和android:hardwareAccelerated=“true”还有其他问题,比如减慢应用程序的速度。我试过了,但在某一点上不起作用ShareThank@webaddicted我知道android:largeHeap=“true”和android:hardwareAccelerated=“true”还有其他问题,如减慢应用程序速度。我尝试过,但在某个点上不起作用。请共享如何在一个活动中的多个图像视图中实现。请共享如何在一个活动中的多个图像视图中实现