使用Matrix对图片进行缩放后的内存溢出问题???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Matrix对图片进行缩放后的内存溢出问题???相关的知识,希望对你有一定的参考价值。

如果一张图片分辨率过大,将它全部加载进内存很容易造成内存溢出现象,解决方法是使用BitmapFactory对图片进行压缩处理,这样一般没什么问题。然而就存在一个问题,使用这种方法对图片压缩后,如果此时我要对图片进行放大处理,那图片就不是很容易失真吗?这个问题一直没得到解决。最近在研究Matrix,发现将ImageView的ScaleType设置为matrix,就可以很方便的对图片进行各种变换,包括缩放。然后我就想这样是不是就不用对图片进行压缩处理了呢?因为我认为在屏幕上显示的只有那么多的像素,图像的其他部分没显示在屏幕上。但是我选择了一张分辨率很大的图片进行了这个操作,发现还是会内存溢出。so,我的问题:[*]使用Matrix对图片进行操作,还是会将原图全部加载进内存吗(即使这张图片没有完全显示在屏幕上)?[*]如果我要显示一张分辨率非常非常大的图片,不能出现内存溢出的情况,并且要能对它进行缩放操作,还能保证显示的质量,这该怎样实现?【其实这应该就是系统图库的功能】希望有研究过这方面问题的朋友能告知一二啊!!@zjw681691 @hehui1860 @cui16882599 @liu321jie @xj753277 @haoliuyou @fortianwei @sk. @futurexiong @su1216

1、使用Matrix对图片进行缩放都是在内存中进行的,也就是说你加载进去一张很大的原图,然后使用这个方法进行压缩,其实原图占用的内存没有任何改变,但是做完处理之后原图的内存是可以释放的。2、图库的代码没有分析过,但是我个人想法,如果一张图非常大,大到不做任何处理只要载入都会内存溢出的地步应该图库还是会在读取原图采样的时候进行处理的。 参考技术A 本篇博客到这里就讲解了如何加载一个大分辨率的图片到内存中并使用它。不过一般好一点的图片处理软件,都会有图片放大功能,如果仅做此处理,单纯的把处理后的图片放大,会影响显示效果,图片还原度不高。一般会重新获取放大区域的图片的分辨率像素数组,然后重新处理加载到内存中进行显示。今天看到了这句话,不清楚怎样实现 参考技术B 要显示一张大图的话 肯定要做压缩等处理 不能直接显示原图 假如一张图是3000*3000 像素点是4 那么转成bitmap在内存中就是34M 绝大部分手机必然OOM 参考技术C 我看到手机上对一张图片进行方法操作时,图片会模糊一下然后变清晰 参考技术D 那个是局部解码,这个我也不是很懂。应该可以解决大图的内存问题。

BitmapFactory.Options对图片进行缩放

package com.pingyijinren.helloworld.activity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.pingyijinren.helloworld.R;

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;
    private Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        bitmap=zoomBitmap(2,2);
        imageView.setImageBitmap(bitmap);
    }

    private Bitmap zoomBitmap(int width,int height) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        options.inPurgeable=true;
        options.inInputShareable=true;
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.beauty, options);
        float scaleWidth = (float) 1.0 / width;
        float scaleHeight = (float) 1.0 / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap scaleBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        bitmap.recycle();
        return scaleBitmap;
    }
}

 

以上是关于使用Matrix对图片进行缩放后的内存溢出问题???的主要内容,如果未能解决你的问题,请参考以下文章

缩放图片加载大图片

Android-加载大图片

BitmapFactory.Options对图片进行缩放

Bitmap图片压缩

Android实现多点触控,自由缩放图片

Android自定义控件之可平移、缩放、旋转图片控件