随着摄像设备的不断进步,图片的大小也在不断的增加,在开发场景中经常遇到进行对象存储服务或者将图片上传至ftp的需求,如果直接上传则非常消耗存储空间和时间,所以我们常常需要对图片进行质量压缩处理贴出一段图片压缩代码
工具类:
/**
* 压缩图片(通过降低图片质量)
* @explain 压缩图片,通过压缩图片质量,保持原图大小
* @param quality
* 图片质量(0-1)
* @return byte[]
* 压缩后的图片(jpg)
* @throws
*/
public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
byte[] imgBytes = null;
try {
ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
BufferedImage image = ImageIO.read(byteInput);
// 如果图片空,返回空
if (image == null) {
return null;
}
// 得到指定Format图片的writer(迭代器)
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
// 得到writer
ImageWriter writer = (ImageWriter) iter.next();
// 得到指定writer的输出参数设置(ImageWriteParam )
ImageWriteParam iwp = writer.getDefaultWriteParam();
// 设置可否压缩
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 设置压缩质量参数
iwp.setCompressionQuality(quality);
iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
ColorModel colorModel = ColorModel.getRGBdefault();
// 指定压缩时使用的色彩模式
iwp.setDestinationType(
new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));
// 开始打包图片,写入byte[]
// 取得内存输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IIOImage iIamge = new IIOImage(image, null, null);
// 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
// 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
writer.write(null, iIamge, iwp);
imgBytes = byteArrayOutputStream.toByteArray();
} catch (IOException e) {
System.out.println("write errro");
e.printStackTrace();
}
return imgBytes;
}
调用示例:项目中用的文件类型为 MultipartFile或者File,我们可以先取出字节数组,再根据文件信息new一个对象,将压缩后的字节数组传进去即可。
public ResultJson uploadImg(@RequestParam("file") MultipartFile fileupload) {
if (fileupload != null) {
String path = "";
try {
// 图片大小超过1MB
if (fileupload.getSize()/1024 > 1024) {
byte[] imgBytes = ImgUtils.compressPicByQuality(fileupload.getBytes(),0.5F);
MultipartFile file = new MockMultipartFile(fileupload.getName(),fileupload.getOriginalFilename(),ContentType.APPLICATION_OCTET_STREAM.toString(),imgBytes);
path = OssFileUtils.uploadSingleFile(file);
} else {
path = OssFileUtils.uploadSingleFile(fileupload);
}
} catch (IOException e1) {
e1.printStackTrace();
}
return ResultJson.ok(path);
} else {
return ResultJson.failure(ResultCode.BAD_REQUEST);
}
}
若存在侵权问题请及时联系,及时删除