Android压缩图片的几种方法

 在移动设备上进行图片相关软件的开发,一定得先压缩图片,毕竟移动设备的内存有限,稍不注意就会导致内存溢出,刚好用到这里,就学习了一下相关的压缩图片,现在总结出来和大家共享。

     一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用 BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。 Options中有个属性inJustDecodeBounds,SDK中的英文引用如下:
If set totrue, the decoder will return null (no bitmap), but the out... fields will stillbe set, allowing the caller to query the bitmap without having to allocate thememory for its pixels.
大致意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。

                 BitmapFactory.Options options = new BitmapFactory.Options();
                 options.inJustDecodeBounds = true;
                 pic[i]  = BitmapFactory.decodeFile(path[i], options); //此时返回bm为空
                 options.inJustDecodeBounds = false;
                //缩放比
                 int be = (int)(options.outHeight / (float)215);
                  if (be <= 0)
                      be = 1;
                 options.inSampleSize = be;
                 options.inSampleSize = computeSampleSize(options, -1, 300*350); 
                  //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
                 pic[i]  = BitmapFactory.decodeFile(path[i], options);

这是option的UML图:

wKioL1PQ05qwrt-3AAHdHx0GhNM002.jpg           

这样出来的图片一般不会失真,但是当你压缩的长宽比例相差较大时还会有失真现象。

这个是等比例缩放:
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);width和height是缩放后的大小,true表示过滤,可消除锯齿感。

newBitmap = Bitmap.createBitmap(oldBitmap, 0, 0, width, height, matrix, true);//用距阵的方式缩放

这个是截取图片某部分:
bitmap = Bitmap.createBitmap(bitmap, x, y, width, height);,意思是从(x,y)开始截取width宽和height高大小的图片。

这些就是android系统中压缩图片的几个方法了。


本文章 转载自

笑傲人生的博客

http://blog.sina.com.cn/xiyouchao [订阅][手机订阅]


你可能感兴趣的:(android,oom,bitmap,图片压缩,加载图片)