티스토리 뷰
반응형
이미지 파일을 파라미터로 받아 destination(저장할 폴더의 디렉터리)에 압축된 이미지를 저장하는 소스입니다.
public static void compressImage(File imageFile, String destination) throws Exception {
File compressedImageFile = new File(destination + imageFile.getName());
InputStream is = new FileInputStream(imageFile);
OutputStream os = new FileOutputStream(compressedImageFile);
float quality = 0.5f;
BufferedImage image = ImageIO.read(is);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
if (!writers.hasNext())
throw new IllegalStateException("No writers found");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.write(null, new IIOImage(image, null, null), param);
is.close();
os.close();
ios.close();
writer.dispose();
}
BufferedImage는 기본 자바에서 제공하는 함수로 자세한 설명은 아래에 있습니다.
www.tutorialspoint.com/java_dip/java_buffered_image.htm
여기에서 quality는 이미지 퀄리티를 의미하는 값이고 0~1 사이의 값을 가지게 됩니다.
0에 가까워질수록 압축률이 높아져 용량이 감소하는 효과가 있습니다.
만일 이미지의 파일 크기가 전부 다른 경우에 특정 이미지 크기로 압축을 하는 경우 위에 연산로직을 추가하면 될 것입니다.
아니면 아래와 같은 소스를 사용해도 됩니다.
private static final int ABSOLUTE_WIDTH = 300;
private static final int ABSOLUTE_HEIGHT = 400;
public static void imageResize(File srcFile, String destination)
throws IOException {
File destFolder = new File(destination);
if (!destFolder.exists()) {
destFolder.mkdirs();
}
BufferedImage originalImage = ImageIO.read(srcFile);
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
BufferedImage resizeImage = resizeImageWithHint(originalImage, type);
ImageIO.write(resizeImage,
StringUtils.getFilenameExtension(srcFile.getPath()),
new File(destination + srcFile.getName()));
}
private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type) {
BufferedImage resizedImage = new BufferedImage(ABSOLUTE_WIDTH, ABSOLUTE_HEIGHT, type);
Graphics2D graphics2D = resizedImage.createGraphics();
graphics2D.drawImage(originalImage, 0, 0, ABSOLUTE_WIDTH, ABSOLUTE_HEIGHT, null);
graphics2D.dispose();
graphics2D.setComposite(AlphaComposite.Src);
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
return resizedImage;
}
반응형
'Server' 카테고리의 다른 글
Node Express Session 설정하기 (0) | 2021.02.08 |
---|---|
Node Express를 적용하여 통신하기 (0) | 2021.02.08 |
Node Express를 활용하여 세션이 적용된 서버 구축하기 (0) | 2021.02.08 |
[Spring] Swagger를 통한 깔끔한 웹뷰 API 명세서 만들기 (0) | 2021.01.20 |
MySQL Provider 에서 사용하는 유틸 만들기 (0) | 2021.01.19 |
[Java] Zip 파일로 다운로드 만들어보기 (0) | 2021.01.18 |
댓글
공지사항