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. 单用户模式进入centos

    修改root密码----------------单用户模式操作 个人原创博客,转载请注明,否则追究法律责任 author: headsen chen date: 2017-9-30 1,开机后,迅速按 ...

  2. 使用log4net记录日志到数据库(含有自定义属性)

    记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法. 第一步:在配置文件中的 ...

  3. .net asp 在1.asp页面嵌入另一个页面2.asp

    <iframe src="http://www.baidu.com" width="100%" height="100%" onloa ...

  4. OA之为用户设置角色和为用户设置权限

    1.为用户设置角色 { Layout = null; } @using OA.Model <!DOCTYPE html> <html> <head> <met ...

  5. OA之框架的搭建

    1.使用框架可以有效的解决耦合性过高的问题,减少代码修改的程度,同时方便添加新的功能.首先创建出基本的几个类库.这个框架就是使用基本的逻辑分层三层架构,然后进一步再使用接口对每个逻辑中的类库调用进行解 ...

  6. BBS - 表、登录、文件上传、注册

    一.博客系统得表关系 models.py from django.db import models from django.contrib.auth.models import AbstractUse ...

  7. Python开发【笔记】:“~” 按位取反运计算方法

    按位取反: 要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的 原码 原码(true form)是一种计算机中对数字的二进制定点表示方法.原码表示 ...

  8. Python开发【笔记】:进程

    序言 进程与线程概述: 很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运 ...

  9. SQL Server批量数据导出导入BCP&Bulk使用

    数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...

  10. CAD和GIS绘制图形分析

    开发CAD和GIS绘图系统有些区别,自己试着分析一下. ♠ 首先CAD图形绘制主要管理图形,因此会有一个抽象的Geometry对象,软件维护一个Geometry对象的集合.如果以图层来管理几何图形,则 ...