Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
1. 加载大图片到内存,从gallery获取图片
android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常,
需要将图片等比例缩小到适合手机屏幕分辨率, 再加载。
从gallery 获取图片, 即要获取另一个activity的返回值。
示例代码:
public class MainActivity extends Activity {
private ImageView iv;
private WindowManager wm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wm = getWindowManager();
iv = (ImageView) findViewById(R.id.iv);
}
// 从系统的图库里面 获取一张照片
public void click(View view) {
Intent intent = new Intent();
intent.setAction("android.intent.action.PICK");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("image/*");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data != null) {
// 获取到系统图库返回回来图片的uri
Uri uri = data.getData();
System.out.println(uri.toString());
try {
InputStream is = getContentResolver().openInputStream(uri);
// 1.计算出来屏幕的宽高.
int windowWidth = wm.getDefaultDisplay().getWidth();
int windowHeight = wm.getDefaultDisplay().getHeight();
//2. 计算图片的宽高.
// 2.计算出来图片的宽高.
BitmapFactory.Options opts = new Options();
// 设置 不去真正的解析位图 不把他加载到内存 只是获取这个图片的宽高信息
opts.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, opts);
int bitmapHeight = opts.outHeight;
int bitmapWidth = opts.outWidth;
if (bitmapHeight > windowHeight || bitmapWidth > windowWidth) {
int scaleX = bitmapWidth/windowWidth;
int scaleY = bitmapHeight/windowHeight;
if(scaleX>scaleY){//按照水平方向的比例缩放
opts.inSampleSize = scaleX;
}else{//按照竖直方向的比例缩放
opts.inSampleSize = scaleY;
}
}else{//如果图片比手机屏幕小 不去缩放了.
opts.inSampleSize = 1;
}
//让位图工厂真正的去解析图片
opts.inJustDecodeBounds = false;
//注意: 流的操作
is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
iv.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
2. 获取图片exif信息
示例代码:图片的所有描述信息都放在头部分,不仅可以读 还可以写入
public void click(View view) {
try {
ExifInterface exifInfo = new ExifInterface(
"/sdcard/DCIM/Camera/IMG_20121103_202628.jpg");
String width = exifInfo.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
String length = exifInfo
.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
System.out.println(width);
System.out.println(length);
// 更改图片的exif 信息.
// exifInfo.setAttribute(tag, value);
} catch (Exception e) {
e.printStackTrace();
}
}
Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息的更多相关文章
- Android学习笔记_51_转android 加载大图片防止内存溢出
首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...
- Android 加载大图片到内存
本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- Android加载大图片OOM异常解决
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过 ...
- android 加载大图片
引用:http://my.eoe.cn/littlebirds/archive/4646.html 尽量不要使用setImageBitmap或setImageResource或BitmapFactor ...
- Android -- 加载大图片的方法
在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); ...
- Android加载大图片实例详解
摘要:在Android下采用ARGB表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.
- android加载大图片到内存
1)演示效果: 1)代码演示: 布局代码: 权限配置:
- Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)
1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
随机推荐
- 部署软件RDMA的步骤
date: 2018-08-28 19:46:56 参考原文原文:http://corasql.blog.51cto.com/5908329/1930455 ...
- java中的socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- 170606、防止sql注入(三)
SpringMVC利用拦截器防止 SQL注入案例一个简单的PHP登录验证SQL注入 比如一个公司有一个用来管理客户的客户管理系统,在进入后台进行管理的时候需要输入用户名和密码.假设在客户端传给服务器的 ...
- 表空间Tablespace
SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改) Oracle Schema Objects——Tables——TableStorage 数据 ...
- php5.6 的curl开启和之前的不太一样了,搞了半天,记录下
设置电脑环境变量中的->系统变量(注:不是用户变量) 新建 PHP_HOME 值 D:\php /PHP 根目录 Path 增加 ;%PHP_HOME%;%PHP_HOME%\ext ...
- Python开发【笔记】:探索Python F-strings
F-strings 在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是F-strings(主要因为这种字符串的第一个字母是f) 简 ...
- Centos 系统Java环境安装
Java安装 安装SUN的JDK: 官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260. ...
- 解决redis远程连接不上的问题
解决redis远程连接不上的问题 redis现在的版本开启redis-server后,redis-cli只能访问到127.0.0.1,因为在配置文件中固定了ip,因此需要修改redis.conf(有的 ...
- top与with ties用法
使用top中把与最后一条记录值相同的数据也放入列表中 一.SQL SERVER中使用WITH TIES的用途 with ties一般是和Top , order by相结合使用的,会查询出最后一条数据额 ...
- 使用Rxjava自己创建RxBus
https://piercezaifman.com/how-to-make-an-event-bus-with-rxjava-and-rxandroid/ https://lingyunzhu.git ...