[android] 加载大图片到内存

默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的

一个图片所占的内存,比如1920*2560像素的图片需要,1920*2560*3至少这些的内存byte

找到ImageView控件对象

调用BitmapFactory对象的decodeFile(pathName)方法,来获取一个位图对象,参数:pathName是String类型的图片路径

把图片导入到手机的sdcard目录下面

调用ImageView对象的setImageBitmap(bitemap)方法,参数:Bitemap对象

此时会报内存溢出的错误

我们需要对图片进行缩放

手机的分辨率比如:320*480  图片的分辨率比如:2000*4000

分别计算比例,2000/320  4000/480,按照大的那个比例进行缩放

调用重载方法BitmapFactory对象的decodeFile(pathName,opts),参数:路径,Options对象

获取BitmapFactory.Option对象,通过new Options()方法

设置Options对象的属性inJustDecodeBounds为ture,仅解析头部信息数据

获取Options对象的outHeight属性,值为图片的高度

获取Options对象的outWidth属性,值为图片的宽度

获取WindowManager对象,通过getSystemSerivce()方法,参数:WINDOW_SERVICE

调用WindowManager对象的getDefaultDisplay().getHeight()或getWidth()方法,获取宽高

计算宽和高的缩放比例

判断,当比例大于1的时候,找出宽高里面的大的值作为图片缩放比例

计算完比例之后

设置Options对象的属性inJustDecodeBounds为false,真解析图片

设置Options对象的采样率属性inSampleSize为上面计算的大的比例

调用重载方法BitmapFactory对象的decodeFile(pathName,opts),获取到Bitmap对象

调用ImageView对象的setImageBitmap(bitemap)方法,参数:Bitemap对象

exif是图片文件的头信息

获取ExifInterface对象,通过new出来

调用ExifInterface对象的getAttribute()方法,获取图片的信息,参数:tag

ExifInterface.TAG_DATETIME 拍摄时间

ExifInterface.TAG_MODEL 拍摄相机

代码:

package com.tsh.loadbigimg;

import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.media.ExifInterface;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private ImageView iv_img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_img=(ImageView) findViewById(R.id.iv_img);

    }
    //加载大图片
    public void load(View v){
        Options opts=new Options();
        opts.inJustDecodeBounds=true;
        BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
        //图片的宽高
        int imgWidth=opts.outWidth;
        int imgHeight=opts.outHeight;

        //屏幕的宽高
        WindowManager wm=(WindowManager) getSystemService(WINDOW_SERVICE);
        int windowHeight=wm.getDefaultDisplay().getWidth();
        int windowWidth=wm.getDefaultDisplay().getWidth();

        int scaleX=imgWidth/windowWidth;
        int scaleY=imgHeight/windowHeight;
        System.out.println("x比例:"+scaleX);
        System.out.println("y比例:"+scaleY);
        //计算缩放比例
        int scale=1;
        if(scaleX>scaleY&&scaleY>1){
            scale=scaleX;
        }
        if(scaleY>scaleX&&scaleX>1){
            scale=scaleY;
        }
        System.out.println("比例:"+scale);
        opts.inJustDecodeBounds=false;
        opts.inSampleSize=scale;
        Bitmap bitmap=BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
        iv_img.setImageBitmap(bitmap);

    }
    //读取信息
    public void read(View v){
        try {
            ExifInterface exif=new ExifInterface("/sdcard/a.jpg");
            String date=exif.getAttribute(ExifInterface.TAG_DATETIME);
            String model=exif.getAttribute(ExifInterface.TAG_MODEL);
            System.out.println("相机:"+model+";时间:"+date);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
时间: 2024-10-10 09:57:40

[android] 加载大图片到内存的相关文章

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

Android加载大图片到内存

加载大图片到内存 步骤: 步骤一: 获取品屏幕的宽高数据;[HD1] 步骤二: 获取图片的宽高;[HD2] 步骤三: 计算屏幕与图片的宽高比例,按照差距最大的进行缩放处理;[HD3] 步骤四: 图片的缩放处理;[HD4] [HD1]// 获取手机的屏幕的窗体大小 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = windowManager.getDef

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

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

1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然后是" rgb" 颜色表示范围 00000000 ~~~ffffffff 2.加载图片到内存: 上面说到了图形表示使用4byte,和int一样,所以Android里面每个像素点都是使用一个int来表示的. Bitmap bitmap = BitmapFactory.decodeResour

Android -- 加载大图片的方法

在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); iv.setImageBitmap(bitmap); 则会抛出内存溢出异常Caused by: java.lang.OutOfMemoryError 正确的做法应该是这样的: public class MainActivity extends Activity { private ImageView iv;

Android加载大图片(压缩)

转载自http://blog.csdn.net/junjx/article/details/7798604 在Android开发中,我们经常需要加载图片.但是图片的尺寸往往会很大,如果我们要的是比较小的图片,在Android有限的内存下,我们显然不能把大尺寸的图片放到内存里,这样不但效率降低,而且会导致java.lang.OutOfMemory异常,相信很多朋友都遇到过这样的问题,那么该怎么解决这一问题呢?其实在Android官方文档中早已给出了解决的方案. 一.读Bitmap的尺寸和类型   

Android有效解决加载大图片时内存溢出的问题

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source, decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsse

Android加载大图片OOM异常解决

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source, decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsse

缩放图片加载大图片

> 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节 * 16色图:每个像素占用1/2个字节 * 256色图:每个像素占用1个字节 * 24位图:每个像素占用3个字节 --- #加载大图片到内存(掌握) >Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出 ##对图片进行缩放(掌握) *第一步:获取屏幕宽高 Display dp = getWindowManager().getDefaultDisplay(); int s