Android编程之Bitmap图片压缩大小

itmap图片太大,会造成内存溢出。一般的都有图片预览机制,就是得到一张尺寸小一点的图片。

这里所谓的缩小尺寸可不是指在layout中设置一下宽高使图片缩小(其实质还是一张占内存大图),而是实实在在的将图片本身缩小,减小内存占用。

以下是方法,详细说明都在注释里了:

[java] view
plain
copy

  1. private Bitmap revitionImageSize(String path, int size) throws IOException {  
  2.         // 取得图片  
  3.         InputStream temp = this.getAssets().open(path);  
  4.         BitmapFactory.Options options = new BitmapFactory.Options();  
  5.         // 这个参数代表,不为bitmap分配内存空间,只记录一些该图片的信息(例如图片大小),说白了就是为了内存优化  
  6.         options.inJustDecodeBounds = true;  
  7.         // 通过创建图片的方式,取得options的内容(这里就是利用了java的地址传递来赋值)  
  8.         BitmapFactory.decodeStream(temp, null, options);  
  9.         // 关闭流  
  10.         temp.close();  
  11.   
  12.         // 生成压缩的图片  
  13.         int i = 0;  
  14.         Bitmap bitmap = null;  
  15.         while (true) {  
  16.             // 这一步是根据要设置的大小,使宽和高都能满足  
  17.             if ((options.outWidth >> i <= size)  
  18.                     && (options.outHeight >> i <= size)) {  
  19.                 // 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!  
  20.                 temp = this.getAssets().open(path);  
  21.                 // 这个参数表示 新生成的图片为原始图片的几分之一。  
  22.                 options.inSampleSize = (int) Math.pow(2.0D, i);  
  23.                 // 这里之前设置为了true,所以要改为false,否则就创建不出图片  
  24.                 options.inJustDecodeBounds = false;  
  25.   
  26.                 bitmap = BitmapFactory.decodeStream(temp, null, options);  
  27.                 break;  
  28.             }  
  29.             i += 1;  
  30.         }  
  31.         return bitmap;  

效果图:

以下是工程文件:
Bitmap图片压缩大小

补充:关于流的重新加载问题,有人提出可以用reset来解决。这里确实可以用reset来解决,我已经试验过。

下面说一下关于reset的事情:

Java  InputStream  的mark 和reset操作
mark用于标记当前位置;在读取一定数量的数据(小于readlimit的数据)后使用reset可以回到mark标记的位置。
FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作;

mark(readlimit)的含义是在当前位置作一个标记,制定可以重新读取的最大字节数,

也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。

通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset

所以,你如果之前改成fileinputstream的话(例如从sd卡中读取的话),就不要用了,还是二次加载吧。

时间: 2024-09-13 19:08:45

Android编程之Bitmap图片压缩大小的相关文章

Android中3种图片压缩处理方法

  这篇文章主要介绍了Android中3种图片压缩处理方法,本文讲解了质量压缩方法.获得缩略图.图片缩放三种方法并分别给出示例代码,需要的朋友可以参考下 Android中图片的存在形式: 1:文件形式:二进制形式存在与硬盘中. 2:流的形式:二进制形式存在与内存中. 3:Bitmap的形式 三种形式的区别: 文件形式和流的形式:对图片体积大小并没有影响.也就是说,如果你手机SD卡上的图片通过流的形式读到内存中,在内存中的大小也是原图的大小. 注意:不是Bitmap的形式. Bitmap的形式:图

Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)_Android

本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

Android编程之TabWidget选项卡用法实例分析_Android

本文实例讲述了Android编程之TabWidget选项卡用法.分享给大家供大家参考,具体如下: 1 概览 TabWidget与TabHost.tab组件一般包括TabHost和TabWidget.FrameLayout,且TabWidget.FrameLayout属于TabHost. 是否继承TabActivity的问题 实现步骤.两种实现方式,一种是将每个Tab的布局嵌在TabHost中的FrameLayout中,每个Tab的内容布局与显示都在FrameLayout中进行,缺点是布局会显得很

Android编程之Sdcard相关代码集锦_Android

本文实例讲述了Android编程之Sdcard相关代码.分享给大家供大家参考,具体如下: 1. 检测Sdcard是否可用: public static boolean sdCardIsAvailable() { String status = Environment.getExternalStorageState(); if (!status.equals(Environment.MEDIA_MOUNTED)) { return false; } return true; } 2. 获得程序在s

Android编程之Animation动画详解_Android

本文实例讲述了Android编程之Animation动画用法.分享给大家供大家参考,具体如下: Animations 一.Animations介绍 Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转.缩放.淡入淡出等,这些效果可以应用在绝大多数的控件中. 二.Animations的分类 Animations从总体上可以分为两大类: 1.Tweened Animations:该类Animations提供了旋转.移动.伸展

Android编程之OpenGL绘图技巧总结_Android

本文实例讲述了Android编程之OpenGL绘图技巧.分享给大家供大家参考,具体如下: 很久不用OpenGL ES绘图,怕自己忘记了,于是重新复习一遍,顺便原理性的东西总结如下: 1. Android 3D坐标系统 如图: Android的三维坐标系统中: 坐标原点位于中央, X轴从左向右延伸,原点左边的值为负数,右边为正数: Y轴从下向上延伸,原点下边的值为负数,上边为正数: Z轴屏幕里面向外面延伸,屏幕里面为负数,外面为正数. 2. 开发工具(OpenGL和OpenGL ES)介绍Open

Android编程之include文件的使用方法_Android

本文实例分析了Android编程之include文件的使用方法.分享给大家供大家参考,具体如下: 记得很久以前,听一位大神说,程序员都很懒,不懒惰的程序员不是好程序员,当时不明白什么意思.后来慢慢的懂得了它的意思,好的程序员不要做重复的工作. 我们在android的布局文件中,常会遇到一些相同的布局,每个页面都写,一是比较麻烦,二是一旦有修改还得改多个文件.这个时候我们就可以用到include了. 非常简单的使用,下面看代码 include的文件scollandlisttitle.xml <?x

Android编程之OpenGL绘图技巧总结

本文实例讲述了Android编程之OpenGL绘图技巧.分享给大家供大家参考,具体如下: 很久不用OpenGL ES绘图,怕自己忘记了,于是重新复习一遍,顺便原理性的东西总结如下: 1. Android 3D坐标系统 如图: Android的三维坐标系统中: 坐标原点位于中央, X轴从左向右延伸,原点左边的值为负数,右边为正数: Y轴从下向上延伸,原点下边的值为负数,上边为正数: Z轴屏幕里面向外面延伸,屏幕里面为负数,外面为正数. 2. 开发工具(OpenGL和OpenGL ES)介绍 Ope

Android编程之selector下设置背景属性值的方法

本文实例讲述了Android编程之selector下设置背景属性值的方法.分享给大家供大家参考,具体如下: 在res/drawable文件夹新增一个文件,此文件设置了图片的触发状态,你可以设置 state_pressed,state_checked,state_pressed,state_selected,state_focused,state_enabled 等几个状态: android:state_pressed Boolean. "true" if this item shoul