Programming language/Java

[Java]이미지 포맷 변환 / Convert PNG to JPG

  • -
반응형

오늘 포스팅할 내용은 자바를 이용한 이미지 포맷을 변환하는 방법입니다.

아래 사이트를 참고하여 코딩했고, 소스를 분석한 내용을 정리해봤습니다.


자바에서는 ImageIO 클래스를 이용해 이미지를 컨트롤할 수 있습니다.

이미지 포맷 변환 프로세스는 다음과 같습니다.

 

  1. 사용자가 파일 저장
  2. 서버단에서 파일 전송 후 PNG 파일인 경우 파일 포맷을 변경(PNG to JPG)
  3. 변환된 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; 
    }
}

[결과]

 

원본이미지(좌) / 변환이미지(우)

 

원본이미지(좌) / 변환이미지(우)

 

 

참고)

 

Convert PNG to JPG Image file using Java - Memorynotfound

This example demonstrates how to convert PNG to JPG image file using Java. You can expect some quality loss when converting images to/from PNG/JPG.

memorynotfound.com

 

ImageIO (Java Platform SE 7 )

Sets a flag indicating whether a disk-based cache file should be used when creating ImageInputStreams and ImageOutputStreams. When reading from a standard InputStream>, it may be necessary to save previously read information in a cache since the underlying

docs.oracle.com


+ 피드백은 언제나 환영입니다 :)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.