图片显示和内存释放

来源:互联网 发布:windows下载 编辑:程序博客网 时间:2024/04/28 22:58

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。
如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常
另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。


另外,以下方式也大有帮助:
1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
     BitmapFactory.Options options=new BitmapFactory.Options();
     options.inJustDecodeBounds = false;
     options.inSampleSize = 10;   //width,hight设为原来的十分一
     Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2. if(!bmp.isRecycle() ){
         bmp.recycle()   //回收图片所占的内存
         system.gc()  //提醒系统及时回收
}


以下奉上自己写的一个方法:


Java代码
/** 
* 以最省内存的方式读取本地资源的图片 
* @param context 
* @param resId 
* @return 
*/ 
public static Bitmap readBitMap(Context context, int resId){  
    BitmapFactory.Options opt = new BitmapFactory.Options();  
    opt.inPreferredConfig = Bitmap.Config.RGB_565;   
    opt.inPurgeable = true;  
    opt.inInputShareable = true;  
       //获取资源图片  
    InputStream is = context.getResources().openRawResource(resId);  
        return BitmapFactory.decodeStream(is,null,opt);  

        /**
         * 以最省内存的方式读取本地资源的图片
         * @param context
         * @param resId
         * @return
         */
        public static Bitmap readBitMap(Context context, int resId){
                BitmapFactory.Options opt = new BitmapFactory.Options();
                opt.inPreferredConfig = Bitmap.Config.RGB_565;
                opt.inPurgeable = true;
                opt.inInputShareable = true;
        //获取资源图片
                InputStream is = context.getResources().openRawResource(resId);
                return BitmapFactory.decodeStream(is,null,opt);
        }

 


--------------------------------------------------------------------
ImageView iv;

String fileName = "/data/data/com.test/aa.png;
Bitmap bm = BitmapFactory.decodeFile(fileName);
iv.setImageBitmap(bm);


ImageView iv = new ImageView(context);
iv.setImageResource(iv[position]);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setLayoutParams(new Gallery.LayoutParams(136,88));


mImageView = (ImageView)this.findViewById(R.id.myImageView1);
mImageView.setImageDrawable(getResources().getDrawable(R.drawable.right)

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-08/40115.htm

 

___________________________________________________________________________
这里我们重点理解ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
 
 CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
 
 CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
 
 CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
 
 FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
 
 FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
 
 FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
 
 FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示
 
 MATRIX / matrix 用矩阵来绘制

 

------------------------------------------------------------------------
//获得Bitmap的高和宽
 int bmpWidth=bmp.getWidth();
 int bmpHeight=bmp.getHeight();
 
 //设置缩小比例
 double scale=0.8;
 //计算出这次要缩小的比例
 scaleWidth=(float)(scaleWidth*scale);
 scaleHeight=(float)(scaleHeight*scale);
 
 //产生resize后的Bitmap对象
 Matrix matrix=new Matrix();
 matrix.postScale(scaleWidth, scaleHeight);
 Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);