반응형
이미지 용량, 사이즈 줄이는 법은
해상도를 줄이는 방법과 픽셀을 줄여 품질을 저하시키는 방법이 있다.
그 두가지 방법은 아래 소스 함수 두개로 나눠져 있다.
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputstream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
improt javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter, javax.imageio.stream.ImageOutputstream;
//품질저하로 용량줄이기
public static boolean mmsQuality(File resImg, File dest)
throws IOException{
float quality = 0.9f; //퀄리티 설정 0.1~1.0까지 압축지정. 숫자가 낮을 수록 화질과 용량이 줄어듬.
float deQuality = 0.1f;
float maxQuality = 0.9f;
float minQuality = 0.1f;
OutputStream os = new FileOutputstream(dest);
BufferedImage image = ImageI0.read(resImg); // Image 읽어들임
Iterator writers= ImageIO.getImageWritersByFormatName("jpg");
while(fileSize.length() > 307200){
if(quality != maxQuality) {
image = ImageI0.read(dest); // 변환한 이미지로 변경
writers = ImageI0.getImageWritersByFormatName("jpg");
os = new FileOutputStream(dest);
}
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);
ios.close(); writer.dispose(); os.close();
fileSize = dest;
if(fileSize.length() -> 307200) {
quality - quality - deQuality;
if(minQuality >= quality) {//최소 휠리티까지 떨어졌는데도 안되면 false
returnVal false;
break;
}
}else{
returnVal = true;
}
}
return returnVal;
}
//해당이미지 크기 변경
public static boolean mmsResizeOrg(File-resImg, File dest, int thumb_len)
throws IOException{
boolean returnVal = false;
BufferedImage srcImg = ImageIO.read(resimg);
int srcWidth = srcImg.getWidth();
int srcHeight = srcImg.getHeight();
int destWidth = -1;
int destHeight = -1;
if (srcWidth > 999 || srcHeight > 999){
if (srcWidth > srcHeight || srcwidth == srcHeight){
destWidth = thumblllen;
destHeight = (int)((double) srcHeight * thumb_len/srcWidth);
}else{
destWidth = (int) ((double) srcWidth * thumb_len/srcHeight);
destHeight = thumb_len;
}
// Image Size 변경
BufferedImage destImg = new BufferedImage(destwidth, destHeight, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = destImg.createGraphics();
g.drawImage(srcImg,-0, 0, destWidth, destHeight, null);
ImageIO.write(destImg,"jpg",dest);
returnVal = true;
}else{
returnVal = false;
}
return returnVal;
}
사이즈를 엄청 줄여야 하는 경우라면 물리적 사이즈를 먼저 줄이고
원하는 용량까지 줄어들도록 퀄리티를 낮추면 수월하게 사용할 수 있을 것이다.
반응형
'Start' 카테고리의 다른 글
오라클 commit 잘못 했을때 당황하지 말고 timestamp (0) | 2024.10.04 |
---|---|
웹취약점 xss 크로스사이트 multipart (1) | 2024.09.27 |
리눅스에 java 설치 및 환경변수 설정 (1) | 2024.09.26 |
안드로이드 하이브리드앱 java, js 이용시 (0) | 2023.10.18 |
리눅스 docker 안에 오라클 시간 변경 (0) | 2023.01.20 |