Android一分钟了解OOM

原创 2015年11月18日 19:59:42

Android 图片加载经常出现内存OOM异常,处理起来也很复杂,主要是图片分辨率过大(如:2880*1620),但是基本原理大概如下:

public static Bitmap oomSolution(Resources res,int resID,int widthpx,int heightpx){
		Options options =new BitmapFactory.Options();
		options.inJustDecodeBounds=true;//不在内存中读取图片
		options.inPreferredConfig = Bitmap.Config.RGB_565;//代表RGB位图
		BitmapFactory.decodeResource(res,resID, options);//压缩前图片
		int width= options.outWidth;//原始图片宽
		int height=options.outHeight;//原始图片高
		if(height>heightpx||width>widthpx){
			int inheight=Math.round((float)height/(float)heightpx);
			int inwidth=Math.round((float)width/(float)widthpx);
			int inSize=inheight>inwidth?inheight:inwidth;
			options.inSampleSize=inSize;//缩放值:1不缩放 2为缩放1/2
		}
		options.inJustDecodeBounds=false;//在内存中创建图片
		Bitmap bm = BitmapFactory.decodeResource(res,resID, options);//压缩后的图片
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG,100, baos);//压缩图片
		return bm;
	}
来源:http://blog.csdn.net/a704755096/article/details/49912211

附:其它Bitmap图片转换工具

public class BitmapUtils {
	/**
	 *Bitmap to Drawable
	 * @param bmp
	 * @return Drawable
	 */
	public static Drawable bitmap2Drawable(Bitmap bmp) {
		BitmapDrawable bd = new BitmapDrawable(bmp);
		return bd;
	}
	/**
	 * Drawable to Bitmap
	 * @param drawable
	 * @return Bitmap
	 */
	public static Bitmap drawable2Bitmap(Drawable drawable) {
		BitmapDrawable bd = (BitmapDrawable) drawable;
		Bitmap bm = bd.getBitmap();
		return bm;
	}
	/**资源图片Resources to Bitmap
	 * @param activity
	 * @param resId
	 * @return Bitmap
	 */
	public static Bitmap getBitmapFromResources(Activity activity, int resId) {
		Resources res = activity.getResources();
		return BitmapFactory.decodeResource(res, resId);
	}
	/**截屏Screenshot 加背景框http://blog.csdn.net/yanzi1225627/article/details/8622257
	 * @param view
	 * @return Bitmap
	 */
	public static Bitmap getBitmapScreenshot(View view){
		//当前视图截屏view=getWindow().getDecorView()   
        int viewWidth = view.getMeasuredWidth();  
        int viewHeight = view.getMeasuredHeight();
        Bitmap b=null;
        if (viewWidth > 0 && viewHeight > 0) {  
            b = Bitmap.createBitmap(viewWidth, viewHeight, Config.RGB_565);  
            Canvas cvs = new Canvas(b);  
            //cvs.drawColor(view.getDrawingCacheBackgroundColor());
            view.draw(cvs);
            return b;
        }
            return b;
	}
	/**数组转图片byte[] to Bitmap
	 * @param bytee
	 * @return Bitmap
	 */
	public static Bitmap convertBytes2Bimap(byte[] bytee) {
		if (bytee.length == 0) {
			return null;
		}
		return BitmapFactory.decodeByteArray(bytee, 0,bytee.length);
	}
	/**图片转数组Bitmap to byte[]
	 * @param bm
	 * @return byte[]
	 */
	public static byte[] convertBitmap2Bytes(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}
	/**放大图片
	 * @param bitmap
	 * @return Bitmap
	 */
	public static Bitmap bigBitmap(Bitmap bitmap) {
	  Matrix matrix = new Matrix(); 
	  matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例
	  Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
	  return resizeBmp;
	 }
	/**缩小图片
	* @param bitmap
	* @return Bitmap
	*/
	 public static Bitmap smallBitmap(Bitmap bitmap) {
	  Matrix matrix = new Matrix(); 
	  matrix.postScale(0.8f,0.8f); //长和宽放大缩小的比例
	  Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
	  return resizeBmp;
	 }
	/**压缩图片解决OOM
	 * @param filepath SD卡路径
	 * @param widthpx 指定宽
	 * @param heightpx 指定高
	 * @return Bitmap
	 */
	public static Bitmap oomBitmap(String filepath,int widthpx,int heightpx){
		Options options =new BitmapFactory.Options();
		options.inJustDecodeBounds=true;//不在内存中读取图片
		options.inPreferredConfig = Bitmap.Config.RGB_565;//代表RGB位图
		BitmapFactory.decodeFile(filepath, options);//压缩前图片
		int width= options.outWidth;//原始图片宽
		int height=options.outHeight;//原始图片高
		if(height>heightpx||width>widthpx){
			int inheight=Math.round((float)height/(float)heightpx);
			int inwidth=Math.round((float)width/(float)widthpx);
			int inSize=inheight>inwidth?inheight:inwidth;
			options.inSampleSize=inSize;//缩放值:1不缩放 2为缩放1/2
		}
		options.inJustDecodeBounds=false;//在内存中创建图片
		Bitmap bm = BitmapFactory.decodeFile(filepath, options);//压缩后的图片
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG,100, baos);//压缩图片
		return bm;
	}
}


一分钟了解:Android 数字签名

Android 数字签名 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系 Android系统要求每一个安装进系统的应...

android解决OOM

  • 2013年03月22日 16:21
  • 942KB
  • 下载

一分钟让你彻底清楚Android四大启动模式

一、启动模式概述             Android开发同学们,估计有很多同学跟我一样,学习Android很久了,还不清楚Activity的四大启动模式,如果耐心看完本文章,相信你会从此彻底...
  • hrx3627
  • hrx3627
  • 2014年08月02日 00:27
  • 14097

android防止oom的图片加载例子

  • 2013年05月04日 22:15
  • 1.06MB
  • 下载

Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一...

Android圆形头像截取,没有OOM

  • 2015年09月08日 17:10
  • 1.41MB
  • 下载

Android 图片压缩不OOM,超高保真度

  • 2015年09月21日 00:24
  • 1.11MB
  • 下载

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

版权声明:本文出自郭霖的博客,转载必须注明出处。 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最近...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android一分钟了解OOM
举报原因:
原因补充:

(最多只允许输入30个字)