Android图片压缩方法并压缩到指定大小
程序员文章站
2023-01-26 23:33:51
一、图片质量压缩
/**
* 质量压缩方法
* @param image
* @return
*/
public...
一、图片质量压缩
/** * 质量压缩方法 * @param image * @return */ public static bitmap compressimage(bitmap image) { bytearrayoutputstream baos = new bytearrayoutputstream(); image.compress(bitmap.compressformat.jpeg, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 90; while (baos.tobytearray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset(); // 重置baos即清空baos image.compress(bitmap.compressformat.jpeg, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中 options -= 10;// 每次都减少10 } bytearrayinputstream isbm = new bytearrayinputstream(baos.tobytearray());// 把压缩后的数据baos存放到bytearrayinputstream中 bitmap bitmap = bitmapfactory.decodestream(isbm, null, null);// 把bytearrayinputstream数据生成图片 return bitmap; }
二、按比例大小压缩 (路径获取图片)
/** * 图片按比例大小压缩方法 * @param srcpath (根据路径获取图片并压缩) * @return */ public static bitmap getimage(string srcpath) { bitmapfactory.options newopts = new bitmapfactory.options(); // 开始读入图片,此时把options.injustdecodebounds 设回true了 newopts.injustdecodebounds = true; bitmap bitmap = bitmapfactory.decodefile(srcpath, newopts);// 此时返回bm为空 newopts.injustdecodebounds = false; int w = newopts.outwidth; int h = newopts.outheight; // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;// 这里设置高度为800f float ww = 480f;// 这里设置宽度为480f // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (int) (newopts.outwidth / ww); } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放 be = (int) (newopts.outheight / hh); } if (be <= 0) be = 1; newopts.insamplesize = be;// 设置缩放比例 // 重新读入图片,注意此时已经把options.injustdecodebounds 设回false了 bitmap = bitmapfactory.decodefile(srcpath, newopts); return compressimage(bitmap);// 压缩好比例大小后再进行质量压缩 }
三、按比例大小压缩 (bitmap)
/** * 图片按比例大小压缩方法 * @param image (根据bitmap图片压缩) * @return */ public static bitmap compressscale(bitmap image) { bytearrayoutputstream baos = new bytearrayoutputstream(); image.compress(bitmap.compressformat.jpeg, 100, baos); // 判断如果图片大于1m,进行压缩避免在生成图片(bitmapfactory.decodestream)时溢出 if (baos.tobytearray().length / 1024 > 1024) { baos.reset();// 重置baos即清空baos image.compress(bitmap.compressformat.jpeg, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中 } bytearrayinputstream isbm = new bytearrayinputstream(baos.tobytearray()); bitmapfactory.options newopts = new bitmapfactory.options(); // 开始读入图片,此时把options.injustdecodebounds 设回true了 newopts.injustdecodebounds = true; bitmap bitmap = bitmapfactory.decodestream(isbm, null, newopts); newopts.injustdecodebounds = false; int w = newopts.outwidth; int h = newopts.outheight; log.i(tag, w + "---------------" + h); // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 // float hh = 800f;// 这里设置高度为800f // float ww = 480f;// 这里设置宽度为480f float hh = 512f; float ww = 512f; // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (int) (newopts.outwidth / ww); } else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放 be = (int) (newopts.outheight / hh); } if (be <= 0) be = 1; newopts.insamplesize = be; // 设置缩放比例 // newopts.inpreferredconfig = config.rgb_565;//降低图片从argb888到rgb565 // 重新读入图片,注意此时已经把options.injustdecodebounds 设回false了 isbm = new bytearrayinputstream(baos.tobytearray()); bitmap = bitmapfactory.decodestream(isbm, null, newopts); return compressimage(bitmap);// 压缩好比例大小后再进行质量压缩 //return bitmap; }
以上所述是小编给大家介绍的android图片压缩方法并压缩到指定大小,希望对大家有所帮助