近期在做图片相关的内容,将图片压缩的相关内容做个总结。以备后期使用前端:
使用 js-image-compressor 第三方工具
安装:
npm i js-image-compressor
import ImageCompressor from 'js-image-compressor';
/**
* 指定大小循环压缩图片,最多压缩5次
* @param file 文件对象
* @param maxSize 最大值
* @returns {Promise<*>} Promise
*/
export async function imageCycleCompressor(file, maxSize) {
if (file.size <= maxSize * 1024) {
return file;
}
//选择压缩比10M:0.1 5M:0.2 1M:0.3 其他:0.4
let quality;
if (file.size >= 1024 * 1024 * 10) {
quality = 0.1;
} else if (file.size >= 1024 * 1024 * 1) {
quality = 0.3;
} else {
quality = 0.4;
}
let i = 0;
while (i < 6 && file.size > maxSize * 1024) {
i++;
file = await CompressorImage(file, quality);
}
return await transToFile(file, file.name, file.type);
}
/**
* blob转file
* @param blob blob
* @param fileName 文件名
* @param fileType 文件类型
* @returns {Promise} Promise
*/
export async function transToFile(blob, fileName, fileType) {
return new window.File([blob], fileName, {type: fileType});
}
/**
* 指定压缩比单次压缩图片
* @param file 文件对象
* @param quality 压缩比
* @returns {Promise} Promise
* @constructor constructor
*/
export async function CompressorImage(file, quality) {
return new Promise((reslove, reject) => {
try {
new ImageCompressor({
file,
quality: quality,
success: (result) => {
reslove(result);
},
});
} catch (error) {
reject(error);
}
});
}
后端
使用 net.coobird:thumbnailator
public class ImageUtil {
/**
* 循环压缩,将指定的图片压缩到小于指定文件大小为止,最大压缩次数为10次
*
* @param file 源文件
* @param thumbnailsFile 缩略图
* @param maxSize 指定的大小
* @return File
* @throws IOException IOException
*/
public static File cycleCompressionImage(File file, File thumbnailsFile, double maxSize) throws IOException {
if (file.length() <= maxSize) {
FileUtils.copyFile(file, thumbnailsFile);
return thumbnailsFile;
}
if (!thumbnailsFile.getParentFile().exists()) {
thumbnailsFile.getParentFile().mkdirs();
}
double scale = getScale(file);
Thumbnails.of(file).scale(scale).toFile(thumbnailsFile);
int i = 0;
while (thumbnailsFile.length() > maxSize && i < Constant.SIX) {
i++;
scale = getScale(thumbnailsFile);
Thumbnails.of(file).scale(scale).toFile(thumbnailsFile);
}
return thumbnailsFile;
}
private static double getScale(File file) {
double scale;
if (file.length() > Constant.RECONVERSION * Constant.RECONVERSION * Constant.TEN) {
scale = 0.1;
} else if (file.length() > Constant.RECONVERSION * Constant.RECONVERSION * Constant.ONE) {
scale = 0.3;
} else {
scale = 0.4;
}
return scale;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)