Android Bitmap压缩方式分析
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图。
在Android开发中我们都会遇到在一个100*100的ImageView上显示一张过大的图片,如果直接把这张图片显示上去对我们应用没有一点好处反而存在OOM的危险,所以我们有必要采用一种有效压缩方式来显示上去。
private void calculateBitmapInSimpleSize() { Bitmap _bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage); getBitmapDatas(_bitmap); BitmapFactory.Options optioins = new BitmapFactory.Options(); optioins.inJustDecodeBounds = true; // optioins.inPreferredConfig = Bitmap.Config.RGB_565;//11158560 optioins.inPreferredConfig = Bitmap.Config.ARGB_8888;//22317120 BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins); int reqWidth = optioins.outWidth; int reqHeight = optioins.outHeight; Log.w(TAG, "reqWidth = " + reqWidth); Log.w(TAG, "reqHeight = " + reqHeight); int inSampleSize = 1; final int widthRatio = Math.round((float)reqWidth / 100f); final int heigthRatio = Math.round((float) reqHeight / 100f); // 取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度 inSampleSize = widthRatio > heigthRatio ? heigthRathtml" target="_blank">io : widthRatio; Log.w(TAG, "first inSampleSize = " + inSampleSize); final int totalPixel = 100 * 100; final int totalReqPixel = reqWidth * reqHeight * 2; Log.w(TAG, "totalReqPixel = " + totalReqPixel); while (totalPixel / (inSampleSize * inSampleSize) > totalReqPixel) { Log.w(TAG, "totalPixel = " + (totalPixel / (inSampleSize * inSampleSize))); inSampleSize ++; } Log.w(TAG, "LastInSampleSize = " + inSampleSize); optioins.inJustDecodeBounds = false; Bitmap lastBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins); getBitmapDatas(lastBitmap); mImageView.setImageBitmap(lastBitmap); }
通过打印log我们可以清楚发现一张原始的图片占有22317120字节,经过压缩后11158560(RGB_565)/ 22317120(RGB8888)明显所占用的内存都减少了,尽量降低这种情况带来的OOM。
做法:
1.optioins.inJustDecodeBounds = true设置为true可用于读取该bitmap的宽高且不会占用内存。
2.optioins.inPreferredConfig = Bitmap.Config.RGB_565设置在内存中以占用最少的方式,相比RGB_8888只有其一半的内存占有。
3.final int widthRatio = Math.round((float)reqWidth / 100f);
final int heigthRatio = Math.round((float) reqHeight / 100f);
inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;
计算压缩比例,取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度。
4.在要显示到ImageView的时候optioins.inJustDecodeBounds = false设回false这样就能正常显示了
// 计算bitmap所占内存值 public void getBitmapDatas(Bitmap bitmap) { Log.w(TAG, "Bitmap size = " + bitmap.getByteCount()); }
采用以上的压缩方式 我们就能避免一张过大的图片”浪费”的显示在ImageView上造成内存消耗过大。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍php压缩和解压缩字符串的方法,包括了php压缩和解压缩字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php压缩和解压缩字符串的方法。分享给大家供大家参考。具体如下: 下面php代码通过gzcompress和gzuncompress压缩和解压缩字符串,可以设定压缩级别 希望本文所述对大家的php程序设计有所帮助。
tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使
我正在使用lz4压缩并将数据写入hive表,该表有20个文件,每个文件在HDFS上都是15G,并且该表的每个文件名都以lz4结尾,例如,。 当我从这个表中运行select count(1)时,它只启动了20个映射器,这意味着lz4 splittable不能生效。 据说lz4支持针对文本文件的可拆分性,所以我想问一下我应该做什么或其他步骤来实现这一点。
Tango拥有一个默认的压缩中间件,可以按照扩展名来进行文件的压缩。同时,你也可以要求某个Action自动或强制使用某种压缩。比如: type CompressExample struct { tango.Compress // 添加这个匿名结构体,要求这个结构体的方法进行自动检测压缩 } func (CompressExample) Get() string { return f
所有基于http协议的服务器组件均支持压缩,请求头Accept-Encoding的值需要包含deflate或者gzip。 即便请求头Accept-Encoding的值包含deflate或者gzip,服务器还会参考静态变量http_server::zip_min_size(默认1024,即1KB)和http_server::zip_max_size(默认307200,即300KB)来决定是否压缩:仅