标签:
一。图片的存在形式
1. 文件(二进制存在于硬盘上)
2. 流的形式(二进制存在于内存中)
3、bitmap形式
不同:文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式。
当图片手bitmap形式存在时,占用的内存会变大很多,我试过500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近10M,当然这个增大的倍数并不是固定的.
public static void compressBmpToFile(Bitmap bmp,File file){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); int options = 80;//个人喜欢从80开始, bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); while (baos.toByteArray().length / 1024 > 100) { baos.reset(); options -= 10; bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); } try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
方法说明 :
这个方法是压缩图片的质量,但是不会减少图片的像素,比如你的图片是300k的,1280*700像素的,经过这种方法的压缩后,File形式的图片是100以下 ,以方便上传 到服务器,但是当 BitmapFactory.decodeFile()到内存中,变成Bitmap时,他的像素还是1280*700,图片像素的计算方法是bitmap.getWidth和bitmap.getHeight(),
private Bitmap compressBmpFromBmp(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int options = 100; image.compress(Bitmap.CompressFormat.JPEG, 100, baos); while (baos.toByteArray().length / 1024 > 100) { baos.reset(); options -= 10; image.compress(Bitmap.CompressFormat.JPEG, options, baos); } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; }
后面的几个方法和之前的一样的
标签:
原文地址:http://www.cnblogs.com/chuiyuan/p/4245552.html