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信息的更多相关文章

  1. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  2. Android 加载大图片到内存

    本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  3. Android加载大图片OOM异常解决

      尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过 ...

  4. android 加载大图片

    引用:http://my.eoe.cn/littlebirds/archive/4646.html 尽量不要使用setImageBitmap或setImageResource或BitmapFactor ...

  5. Android -- 加载大图片的方法

    在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); ...

  6. Android加载大图片实例详解

    摘要:在Android下采用ARGB表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.

  7. android加载大图片到内存

    1)演示效果: 1)代码演示: 布局代码: 权限配置:

  8. Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)

    1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...

  9. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

随机推荐

  1. C# Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)

    可使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件来实现表单或者URL提交数据的获取,获取后传给SQLInje ...

  2. R的grep和grepl

    grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, ...

  3. spring-boot集成redis

    application.properties #redis 配置 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redi ...

  4. JAVAWEB Filter使用

    Filter学习 1Filter是什么:是过滤器简称 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator ...

  5. Linux服务器报错too many open files错误解决方案

    1.本质解决方案按照oracle的安装脚本中以下几项文件进行相应配置: cp /etc/security/limits.conf /etc/security/limits.conf.bak echo ...

  6. gnome,xfce,unity,vncserver chinese,jvm locale language

      __________________________ yum search vnc-server sudo yum install tigervnc-server vncserver -list ...

  7. Python知识总汇

    一.python基础 python基础 python编码问题 逻辑运算 二.python数据类型 二.python数据类型 三.IO(文件处理) 三.IO(文件处理) 四.函数 函数基础 名称空间与作 ...

  8. Nginx rewrite 中break与last指令的区别

    location /break/ { rewrite ^/break/(.*) /test/$1 break; return 402; } location /last/ { rewrite ^/la ...

  9. python之celery队列模块

    一.celery队列简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 1 ...

  10. spring登录验证拦截器和根据用户角色登录

    大家都知道spring的用户登录拦截器,确实省去了程序员不少的精力,下面说说我在项目中使用的感受. 德安微信管理后台是管理多个微信帐号的平台,登录到平台的用户有三个角色,游客和微信帐号管理员.超级管理 ...