java实现压缩图片且不改变原图尺寸
生活随笔
收集整理的這篇文章主要介紹了
java实现压缩图片且不改变原图尺寸
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求:
大于2MB的圖片需要壓縮到2MB以下,且不改變原圖的尺寸。
(推薦教程:java入門教程)
引入依賴:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
附件實體類:
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class FileCO {
/**
* 附件字節流
*/
private byte[] fileContent;
/**
* 附件OID
*/
private UUID attachmentOid;
}
(視頻教程推薦:java視頻教程)
圖片實體類:
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ImageInfo {
/**
* 圖片字節流
*/
private byte[] imageBytes;
/**
* 圖片是否進行壓縮
*/
private Boolean compressFlag;
/**
* 圖片寬度
*/
private Integer width;
/**
* 圖片高度
*/
private Integer height;
}
圖片壓縮工具類:
@Slf4j
public class ImageUtils {
/**
* 合法圖片大小為2MB
*/
private static final Long LEGAL_IMAGE_SIZE = 1024 * 2L;
/**
* 圖片壓縮 當圖片大小大于2MB進行等比例壓縮
* 不修改圖片尺寸進行壓縮
*
* @param fileCO
* @return
*/
public static ImageInfo compressImageForScale(FileCO fileCO) throws IOException {
byte[] imageBytes = fileCO.getFileContent();
UUID attachmentOid = fileCO.getAttachmentOid();
try {
BufferedImage sourceImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
//高度
int height = sourceImage.getHeight();
//寬度
int width = sourceImage.getWidth();
if (imageBytes.length <= 0 || imageBytes.length < LEGAL_IMAGE_SIZE * 1024) {
return ImageInfo.builder()
.imageBytes(imageBytes)
.width(width)
.height(height)
.compressFlag(false)
.build();
}
long srcSize = imageBytes.length;
double accuracy = getAccuracy(srcSize / 1024);
while (imageBytes.length > LEGAL_IMAGE_SIZE * 1024) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream)
.scale(1f)
.outputQuality(accuracy)
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
log.info("【圖片壓縮】附件OID={} | 圖片原大小={}kb | 壓縮后大小={}kb",
attachmentOid, srcSize / 1024, imageBytes.length / 1024);
return ImageInfo.builder()
.imageBytes(imageBytes)
.width(width)
.height(height)
.compressFlag(true)
.build();
} catch (Exception e) {
log.error("【圖片壓縮】msg=圖片壓縮失敗!", e);
throw e;
}
}
/**
* 計算壓縮精度
*
* @param size
* @return
*/
private static double getAccuracy(long size) {
double accuracy;
//圖片大小小于4M,壓縮精度為0.44;否則精度為0.4
if (size <= 2048 * 2) {
accuracy = 0.44;
} else {
accuracy = 0.4;
}
return accuracy;
}
}
總結
以上是生活随笔為你收集整理的java实现压缩图片且不改变原图尺寸的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 12 第四个公开测试版更新了哪些
- 下一篇: 如何查询 iPhone X 的保修状态和