加载大图片到内存

多媒体:很多信息的展现方式

                                                文件  图片  声音  视屏

                                               

默认情况下   每个android程序 dailvik 虚拟机 最大堆空间大小 16M

所以,如果我们要加载的图片很大的情况下,内存是不允许的,因此我们必须要将图片进行适当的缩放。

 

xml文件:

<Button

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:onClick="load"

    android:text="加载图片到内存"/>

<ImageView

    android:id="@+id/iv"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"/>

 

MainActivity文件:

 

private ImageView iv;

private int windowheight;

private int windowwidth;

 

protected void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

 

    iv = (ImageView) findViewById(R.id.iv);

    //得到手机屏幕的高度

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

    windowheight = wm.getDefaultDisplay().getHeight();

    windowwidth = wm.getDefaultDisplay().getWidth();

 

    //一下代码是新的API不过2.3系统不存在

    /**Point outSize = new Point();

    *wm.getDefaultDisplay.getSize(outSize);

    *outSize.x;

    *outSize.y;

    */ 

}

 

public void load(View view){

    //图片解析的配置

    BitmapFactory.Options opts = new Options();

    //不去真的解析图片 只是获取图片的头部信息宽高

    opts.inJustDecodeBounds =true;

    BitmapFactory.decodeFile("/sdcard/a.jpg", opts);

    int imageHeight = opts.outHeight;

    int imageWidth = opts.outWidth;

    System.out.println("图片宽度:"+ imageWidth);

    System.out.println("图片的高度:"+ imageHeight);

 

    //计算缩放比例

    int scaleX = imageWidth/windowwidth;

    int scaleY = imageHeight/windowheight;

    int scale = 1;

    if(scaleX > scaleY & scaleY >=1){

        scale = scaleX;

    }

    if(scaleY > scaleX & scaleX >=1){

        scale = scaleY;

    }

 

    //解析图片

    opts.inJustDecodeBounds =false;

    //采样率

    opts.inSampleSize = scale;

    Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg", opts);

    iv.setImageBitmap(bitmap); 

}

  

获取图片exif信息:

public void read(View view){

    try{

        ExifInterface exif = new ExifInterface("/sdcard/a.jpg");

        String time = exif.getAttribute(ExifInterface.TAG_DATETIME);

        System.out.println(time);

        String model = exif.getAttribute(ExifInterface.TAG_MODEL);

        System.out.println("model:"+ model);

 

        //也可通过exif.setAttribute(String tag, String value)方法设置相应的属性

 

    }catch(IOException e){

        e.printStackTrace();

    }   

}

posted @ 2015-10-25 17:13  飞牛冲天  阅读(164)  评论(0编辑  收藏  举报