盲点1: 在这里首先普及一个知识,目前安卓还没有一个方法可以直接把一张图片压缩到指定的字节大小。 压缩图片有压缩尺寸,有压缩质量,压缩质量带来的效果是绝对可以减少图片的字节大小的,而压缩图片的尺寸则不一定会把图片的字节大小给降下去, 有时候当你把一张图片缩小一点点,而图片本身所占的内存反而增多了,不信的同学你们可以自己尝试一下。 盲点2:一个文件图片100kb,存放在sd卡里面,当以bitmap形式读出来的时候,bitmap在内存里面所占的字节大小,一般情况下是绝对》=100kb的 读取bitmap字节大小的方法有 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//这里100的话表示不压缩质量 long length=baos.toByteArray().length/1024;//读出图片的kb大小 得到的length一般是大于100kb的,强烈建议各位同学试一试,口说无凭。 重点:接下来就要教大家真正的对图片的质量压缩到指定大小,(只是接近这个大小,无法保证一样大) public static byte[] compressBitmap(Bitmap bitmap,float size){ if(bitmap==null||getSizeOfBitmap(bitmap)<=size){ return null;//如果图片本身的大小已经小于这个大小了,就没必要进行压缩 } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//如果签名是png的话,则不管quality是多少,都不会进行质量的压缩 int quality=100; while (baos.toByteArray().length / 1024f>size) { quality=quality-4;// 每次都减少4 baos.reset();// 重置baos即清空baos if(quality<=0){ break; } bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); Logg.e("------质量--------"+baos.toByteArray().length/1024f); } return baos.toByteArray(); } 一般我们要对图片的字节大小进行压缩是为了把图片上传到服务器,而上传的形式则是以字符串的形式,所以我们要得到的则是byte数组 如果byte数组满足要求,则byte数组转化成base64字符串上传到服务器就OK了 测试如下:服务器运行上传的最大小是100kb左右,而我现在有一张114kb大小的图片,如果不处理的话,则会上传失败 调用方法如下 byte[] bcompressBitmap(tempPath, 90); //90代表kb大小 打印数据如下:
最终上传成功了 |
bitmap图片压缩
最新推荐文章于 2021-05-29 00:06:07 发布