오늘 포스팅할 내용은 자바를 이용한 이미지 포맷을 변환하는 방법입니다.
아래 사이트를 참고하여 코딩했고, 소스를 분석한 내용을 정리해봤습니다.
자바에서는 ImageIO 클래스를 이용해 이미지를 컨트롤할 수 있습니다.
이미지 포맷 변환 프로세스는 다음과 같습니다.
- 사용자가 파일 저장
- 서버단에서 파일 전송 후 PNG 파일인 경우 파일 포맷을 변경(PNG to JPG)
- 변환된 JPG 파일 저장
아래 소스에서 사용된 ImageIO의 메소드는 read와 write입니다.
File beforeFile = new File(PATH + fileName + "_" + fileUploadTime + "." + fileType);
File afterFile = new File(PATH + fileName + "_" + fileUploadTime + ".jpg");
BufferedImage beforeImg = ImageIO.read(beforeFile);
read 메소드를 사용하여 생성된 File 인스턴스로부터 이미지를 읽거나, 지정된 URL을 이용해 이미지를 읽어올 수 있습니다.
BufferedImage afterImg = new BufferedImage(beforeImg.getWidth(), beforeImg.getHeight(), BufferedImage.TYPE_INT_RGB);
읽어온 이미지로 BuffredImage를 구축하여 이미지를 jpg 파일로 변환하기 위한 작업을 합니다.
afterImg.createGraphics().drawImage(beforeImg, 0, 0, Color.white, null);
createGraphics() 메소드 호출로 BufferImage에 그림을 그릴 수 있게 Graphics2D 객체를 먼저 구현하고,
구현된 Graphics2D 객체를 사용해 원본 BufferdImage(beforeImg)를 변환 이미지 객체(afterImg)에 그려넣습니다.
ImageIO.write(afterImg, "jpg", afterFile);
마지막으로 변환된 이미지 객체는 write 메소드에 의해 지정된 형식의 이미지 파일로 출력됩니다.
(afterFile : 출력되는 파일)
package com.planm.util;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class FileUtil {
private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);
// 파일 업로드
public String fileUpload(MultipartHttpServletRequest mtfRequest, String uploadPath) {
CommonUtil commonUtil = new CommonUtil();
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyyMMddHHmm");
Date date = new Date();
String PATH = "D:\\PLANM\\file\\" + uploadPath + "\\"; // 파일 저장 경로
String fileName = ""; // 파일 이름(확장자 제외)
String fileFullName = ""; // 파일 이름(확장자 포함)
String fileType = ""; // 파일 확장자
String fileUploadTime = sdf.format(date); // 파일 업로드 시간(yyyymmddhhmm)
String uploadFileName = ""; // 최종 업로드 파일명(DB에 저장)
try {
// 파일 저장 경로가 없다면 생성
File dir = new File(PATH);
if (!dir.isDirectory()) {
dir.mkdirs();
}
Iterator<String> itr = mtfRequest.getFileNames();
if(itr.hasNext()) {
List<MultipartFile> mpf = mtfRequest.getFiles((String) itr.next());
if(!mpf.get(0).getOriginalFilename().equals("")) {
for(int i = 0; i < mpf.size(); i++) {
fileName = FilenameUtils.getBaseName(mpf.get(i).getOriginalFilename());
fileFullName = mpf.get(i).getOriginalFilename();
fileType = fileFullName.substring(fileFullName.lastIndexOf(".") + 1, fileFullName.length());
uploadFileName = uploadFileName + fileName + "_" + fileUploadTime + "." + fileType + ",";
File file = new File(PATH + fileName + "_" + fileUploadTime + "." + fileType);
logger.info("----------------------- FILE UPLOAD START ---------------------------");
logger.info("FILE : " + file.getAbsolutePath());
logger.info("SIZE : " + mpf.get(i).getSize() + "bytes");
logger.info("----------------------- FILE UPLOAD END -----------------------------");
mpf.get(i).transferTo(file); // 파일 전송
if(fileType.equals("png")) {
logger.info("----------------------- Convert PNG to JPG ---------------------------");
File beforeFile = new File(PATH + fileName + "_" + fileUploadTime + "." + fileType);
File afterFile = new File(PATH + fileName + "_" + fileUploadTime + ".jpg");
BufferedImage beforeImg = ImageIO.read(beforeFile);
BufferedImage afterImg = new BufferedImage(beforeImg.getWidth(), beforeImg.getHeight(), BufferedImage.TYPE_INT_RGB);
afterImg.createGraphics().drawImage(beforeImg, 0, 0, Color.white, null);
ImageIO.write(afterImg, "jpg", afterFile);
logger.info("------------------------- Convert Success -----------------------------");
}
}
uploadFileName = commonUtil.returnRmvStr(uploadFileName);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return uploadFileName;
}
}
[결과]
참고)
+ 피드백은 언제나 환영입니다 :)