• 以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法


    我们在加载图片时经常会遇到内存溢出的问题,图片太大,我们加载图片时,一般都是用的如下一般方法(加载本地图片):

     /**
    	 * 不作处理,去加载图片的方法,碰到比较大的图片会内存溢出
    	 */
    	private void loadBigImage() {
    		Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg");
    		iv.setImageBitmap(bitmap);
    	}
    这种方法小图片一般可能没问题,但是大图片时,就会越到内存溢出的问题。那怎样解决呢?那就是通过BitmapFactory.Options opts = new Options()这个参数的配置来解决,方法如下:

     /**
    	 * 以节省内存的方法加载图片
    	 */
    	private void loadImage() {
    		// 图片解析的配置
    		BitmapFactory.Options opts = new Options();
    		// 设置为True的意思:不是真的去解析 图片,只是获取图片的头部信息,比如宽,高等
    		opts.inJustDecodeBounds = true;
    		BitmapFactory.decodeFile("/sdcard/test.jpg", opts);
    		// 获取图片的真实的高度和宽度
    		int imageWidth = opts.outWidth;
    		int imageHeight = opts.outHeight;
    		// 计算缩放比例
    		int scaleX = imageWidth / screenWidth;
    		int scaleY = imageHeight / screenHeight;
    
    		int scale = 1;
    		if (scaleX > scaleY & scaleY >= 1) {
    			scale = scaleX;
    		}
    		if (scaleY > scaleX & scaleX >= 1) {
    			scale = scaleY;
    		}
    		// 真的要去解析图片了,所以设置为false
    		opts.inJustDecodeBounds = false;
    		// 采样率 设置参数,设置缩放比
    		opts.inSampleSize = scale;
    		Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", opts);
    		iv.setImageBitmap(bitmap);
    
    	}
    上边的这个方法进行了按屏幕的比例进行缩放,使显示的图片占用的内存尽量小。

    在这里我们再讲Exif信息,那什么是Exif信息呢?Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。

    那怎样获取Exif信息呢?方法如下:

     /**
    	 * 获取图片的Exif信息
    	 * 
    	 * 
    	 */
    	private void getExifInfo() {
    		try {
    			ExifInterface exif = new ExifInterface("/sdcard/test.jpg");
    			// 获取照片上的时间信息
    			String time = exif.getAttribute(ExifInterface.TAG_DATETIME);
    			System.out.println("time:" + time);
    			// 获取模式信息,比如什么手机照的
    			String mode = exif.getAttribute(ExifInterface.TAG_MODEL);
    			System.out.println("mode:" + mode);
    
    			// 其实还可以设置Exif信息比如:tag:DES的名字可以随便定义,属性内容自己写
    			// exif.setAttribute("DES", "这个拍摄于2014年1月,是我在哪里旅游时拍的。");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    一般我们获取屏幕宽度和高度使用的方法是这样的:

      WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    		// 获取屏幕的高度和宽度,这个虽被抛弃了,但是通用,所以暂时还得用这个
    		screenWidth = wm.getDefaultDisplay().getWidth();
    		screenHeight = wm.getDefaultDisplay().getHeight();
    但是这种方法在api13之后就被抛弃了,api13之后用的方法如下:

      /**
    		 * 下边是一种没有被抛弃的方法,但是是从API13之后才能用
    		 */
    		WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    		Point point = new Point();
    		wm.getDefaultDisplay().getSize(point);
    		screenWidth = point.x;
    		screenHeight = point.y;
    但是这种方法只能在api13之后的能用,之前的会报错,所有通用的话,还是得使用上边的那种已被抛弃的方法。

  • 相关阅读:
    496 服务器渲染 VS 客户端渲染
    495 队列,优先级队列
    493 JS中数据类型检测的四种方案
    492 js的继承:原型继承,CALL继承,寄生组合式继承,ES6中的类和继承
    491 CALL和APPLY以及BIND语法(含BIND的核心原理),CALL和APPLY的应用(类数组借用数组原型方法),CALL源码解析及阿里面试题
    490 JavaScript的this的五种指向
    488 DOM0和DOM2事件绑定的原理、使用、区别
    487 函数的三种角色:普通函数,构造函数(类),普通对象,原型链清明上河图
    486 原型及原型链模式:3个重要知识点,从面向对象角度来讲解内置类,hasOwnProperty,原型链方法中的THIS问题,基于内置类的原型扩展方法
    485 面向对象:单例设计模式,工厂模式,什么是面向对象,构造函数,instanceof,构造函数中的局部变量以及new构造函数时不加括号
  • 原文地址:https://www.cnblogs.com/loonggg/p/4981815.html
Copyright © 2020-2023  润新知