/** * 根据指定大小压缩图片 * * @param imagePath 源图片地址(网络地址) * @param desFileSize 指定图片大小,单位kb * @param imageId 影像编号 * @return 压缩质量后的图片字节数组 */ public static String compressPicForScale(String imagePath, long desFileSize, String imageId) { BASE64Encoder encoder = new BASE64Encoder(); byte[] data = getBytesFromHost(imagePath); System.out.println("原始数据大小=======" + data.length); if (data.length < desFileSize * 1024) { return encoder.encode(data); } long srcSize = data.length; double accuracy = getAccuracy(srcSize / 1024); try { while (data.length > desFileSize * 1024) { ByteArrayInputStream inputStream = new ByteArrayInputStream(data); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); Thumbnails.of(inputStream) .scale(accuracy) .outputQuality(accuracy) .toOutputStream(outputStream); data = outputStream.toByteArray(); } logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", imageId, srcSize / 1024, data.length / 1024); } catch (Exception e) { logger.error("【图片压缩】msg=图片压缩失败!", e); } System.out.println("原始数据后=======" + data.length); return encoder.encode(data); }
//将网络地址对应的图片转换为base64 public static String imageChangeBase64(String imagePath){ InputStream inputStream = null; byte[] data = getBytesFromHost(imagePath); System.out.println("length======= " + data.length); // 加密 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }
/** * url : 图片路径 : 找到一张图片复制链接地址 * desFileSize 指定图片大小,单位kb * * @param imageId 影像编号 * * @return 压缩质量后的图片字节数组 * @param args */ public static void main(String[] args) { System.out.println("你还会或或或"); // String url = ""; // System.out.println(ImageUtil.imageChangeBase64(url)); String s = compressPicForScale("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1564025725&di=0c930fc21fbf99af3d731d74f9258631&src=http://photo14.zastatic.com/images/photo/8917/35665191/1313658915191.jpg", 2, "30"); // System.out.println("压缩后数据大小" + s); }
/**
* 自动调节精度(经验数值)
*
* @param size 源图片大小
* @return 图片压缩质量比
*/
private static double getAccuracy(long size) {
double accuracy;
if (size < 900) {
accuracy = 0.85;
} else if (size < 2047) {
accuracy = 0.6;
} else if (size < 3275) {
accuracy = 0.44;
} else {
accuracy = 0.4;
}
return accuracy;
}
成功效果:
原始数据大小=======15768
原始数据后=======1858