一个好用的android图片压缩工具类
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:29
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">用了良久图片紧缩,之前人们一向应用google的官方图片紧缩办法</span>
final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options);
public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; }
代率攀来自google
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
细心看calucelateInSamplesize办法,该算法返回的是一种紧缩比例,细心一看他的计算过程,你会发明,inSampleSize的变更过程是2-4-8,,而真正进入wile轮回时,宽高就已经被算作是小了一笆攀来计算的了,所以,膳绫擎那个网站说12M能紧缩到0.75M,就是因为差距太大年夜,如不雅安卓手机内部紧缩本身的图片(大年夜概是2M紧缩到100K),所以此时,这个办法就实用于android编码紧缩了。
所以不才针对于android编码时紧缩,在此对它进行了优化,优化后代码如下:
运行: culculateInSampleSize(bm,200,300)效不雅:
<pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">/**</span>* 盘似揭捉缩比例值(改进版 by touch_ping)
*
* 原版2>4>8...倍紧缩
* 当前2>3>4...倍紧缩
*
* @param options
* 解析图片的设备信息
* @param reqWidth
* 所需图片紧缩尺寸最小宽度
* @param reqHeight
* 所需图片紧缩尺寸最小高度
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int picheight = options.outHeight;
final int picwidth = options.outWidth;
Log.i("test", "原尺寸:" + picwidth + "*" +picheight);
int targetheight = picheight;
int targetwidth = picwidth;
int inSampleSize = 1;
if (targetheight > reqHeight || targetwidth > reqWidth) {
while (targetheight >= reqHeight
&& targetwidth>= reqWidth) {
Log.i("test","紧缩:" +inSampleSize + "倍");
inSampleSize += 1;
targetheight = picheight/inSampleSize;
targetwidth = picwidth/inSampleSize;
}
}
Log.i("test","最终紧缩比例:" +inSampleSize + "倍");
Log.i("test", "新尺寸:" + targetwidth + "*" +targetheight);
return inSampleSize;
}
紧缩效不雅如下:
[img]
文件大年夜小大年夜1.12M变成81.75k
最终附上完全紧缩对象类:
package com.example.mqtest; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; /** * 图片紧缩对象类 * @author touch_ping * 2015-1-5 下昼1:29:59 */ public class BitmapCompressor { /** * 质量紧缩 * @author ping 2015-1-5 下昼1:29:58 * @param image * @param maxkb * @return */ public static Bitmap compressBitmap(Bitmap image,int maxkb) { //L.showlog("紧缩图片"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 质量紧缩办法,这里100表示不紧缩,把紧缩后的数据存放到baos中 int options = 100; // Log.i("test","原始大年夜小" + baos.toByteArray().length); while (baos.toByteArray().length / 1024 > maxkb) { // 轮回断定如不雅紧缩后图片是否大年夜于(maxkb)50kb,大年夜于持续紧缩 // Log.i("test","紧缩一次!"); baos.reset();// 重置baos即清空baos options -= 10;// 每次都削减10 image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里紧缩options%,把紧缩后的数据存放到baos中 } // Log.i("test","紧缩后大年夜小" + baos.toByteArray().length); ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把紧缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片 return bitmap; } /** * http://developer.android.com/training/displaying-bitmaps/load-bitmap.html * 官网:获取紧缩后的图片 * * @param res * @param resId * @param reqWidth * 所需图片紧缩尺寸最小宽度 * @param reqHeight * 所需图片紧缩尺寸最小高度 * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } /** * 官网:获取紧缩后的图片 * * @param res * @param resId * @param reqWidth * 所需图片紧缩尺寸最小宽度 * @param reqHeight * 所需图片紧缩尺寸最小高度 * @return */ public static Bitmap decodeSampledBitmapFromFile(String filepath, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filepath, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filepath, options); } public static Bitmap decodeSampledBitmapFromBitmap(Bitmap bitmap, int reqWidth, int reqHeight) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 90, baos); byte[] data = http://www.sjsjw.com/100/000202MYM011683/baos.toByteArray(); final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(data, 0, data.length, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeByteArray(data, 0, data.length, options); } /** * 盘似揭捉缩比例值(改进版 by touch_ping) * * 原版2>4>8...倍紧缩 * 当前2>3>4...倍紧缩 * * @param options * 解析图片的设备信息 * @param reqWidth * 所需图片紧缩尺寸最小宽度O * @param reqHeight * 所需图片紧缩尺寸最小高度 * @return */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int picheight = options.outHeight; final int picwidth = options.outWidth; Log.i("test", "原尺寸:" + picwidth + "*" +picheight); int targetheight = picheight; int targetwidth = picwidth; int inSampleSize = 1; if (targetheight > reqHeight || targetwidth > reqWidth) { while (targetheight >= reqHeight && targetwidth>= reqWidth) { Log.i("test","紧缩:" +inSampleSize + "倍"); inSampleSize += 1; targetheight = picheight/inSampleSize; targetwidth = picwidth/inSampleSize; } } Log.i("test","最终紧缩比例:" +inSampleSize + "倍"); Log.i("test", "新尺寸:" + targetwidth + "*" +targetheight); return inSampleSize; } }
public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; }