以最省内存的方式把大图片加载到内存及获取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之后的能用,之前的会报错,所有通用的话,还是得使用上边的那种已被抛弃的方法。
以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法的更多相关文章
- tflearn 数据集太大无法加载进内存问题?——使用image_preloader 或者是 hdf5 dataset to deal with that issue
tflearn 数据集太大无法加载进内存问题? Hi, all! I'm trying to train deep net on a big dataset that doesn't fit into ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写
1加载图片到内存 (1).数码相机照片特别是大于3m以上的,内存吃不消,会报OutOfMemoryError,若是想只显示原图片的1/8,可以通过BitmapFactory.Options来实现,具体 ...
- iOS开发图片加载的内存问题及优化方案
原创作者:Magic-Unique 原文地址:https://github.com/Magic-Unique/HXImage猿吧 - 资源共享论坛: http://www.coderbar.cn 做最 ...
- iOS 图片加载导致内存警告
虽然UITableView和UICollectionView都有cell复用机制,但是如果利用SDWebImage加载的图片本身过大且cell复用池中的个数比较多(cell的Size越小,复用池中的c ...
- ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存
声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...
- canvas代替imgage,可以有效的提高大图片加载的速度!
//加载zepto插件 <script> //定义图片的数量 var total = 17; //获取屏幕的宽度 var zWin = $(window); //定义渲染图片的方法 var ...
- vue自定义指令,比onerror更优雅的方式实现当图片加载失败时使用默认图,提供三种方法
首先,来看下效果图(演示一下图片正常加载与加载失败时的效果) 在线体验地址:https://hxkj.vip/demo/vueImgOnerror/ 一.常规方法解决 我们都知道,img标签支持one ...
- [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化
11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依 ...
随机推荐
- 详解如何利用FarPoint Spread表格控件来构造Winform的Excel表格界面输入
我们先来简单了解一下WinForm和FarPoint,WinForm是·Net开发平台中对Windows Form的一种称谓.而FarPoint是一款模拟EXCEL的控件.它可以根据用户的要求实现很大 ...
- 关于ASP.NET页面事件的知识点
ASP是动态服务器页面(ActiveServerPage)的英文缩写,是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单.方便的编程工具.那么关于ASP.NET ...
- html中如何使用python屏蔽一些基本功能
进行数据解析的理由不计其数,相关的工具和技巧也同样如此.但是,当您需要用这些数据做一些新的事情时,即使有“合适的”工具可能也是不够的.这一担心对于异类数据源的集成同样存在.用来做这项工作的合适工具迟早 ...
- Verilog频率计设计
这是以前的一个可编程逻辑课上机实验三 实验报告 数字频率计的基本设计思路是在给定一个time开始测量的时候产生的T的个数,也就是采用一个标准的基准时钟,在单位时间(1秒)里对被测信号的脉冲数进行计数. ...
- linux下composer+laravel随笔
1.composer中文网:https://www.phpcomposer.com/ laravel中文网:https://d.laravel-china.org/ 2.composer是的作用是 ...
- 转:spring mvc返回json数据格式
转:http://www.cnblogs.com/ssslinppp/p/4675495.html <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: ...
- Nginx+Tomcat+memcached高可用会话保持
Nginx+Tomcat+memcached高可用会话保持 文章来源dyc2005 一.概述 之前文章已经描述了企业高可用负载相关的架构及实现,其中常用的nginx或haproxy,LVS结合ke ...
- LeetCode46. Permutations
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...
- mysql指定id默认第一
有个需求 家庭创建人要默认排第一,刚开始用加入家庭的时间排序可以 好简单, 后来加了一个需求 家庭创建人可以转移,结果按时间排序就不行了,又不想去写循环重新排序 就各种百度, 等于就是指定ID排最后 ...
- spring-mybatis整合异常
Failed to read artifact descriptor for XXXXXX:jar:XXXX.RELEAS 原因是maven的本地仓库没有设置好.在别处拷贝过来的项目会有自己的仓库位置 ...