본문 바로가기
Java & Spring

JAVA image resizing 이미지 리사이징 (feat. thumbnail), crop 지원

by 모닝위즈 2023. 9. 15.
반응형

디렉터리에 원본 이미지가 존재할 경우.

원본 이미지를 이용하여 썸네일(Thumbnail)을 만들거나 작은 사이즈로 만들고 싶은 경우 활용이 가능하다.

/**
 * 원본 이미지를 활용하여 리사이징된 이미지를 생성한다.
 *
 * @author mitw.tistory.com
 * @see <pre>
 *  Modification Information
 *
 *     수정일      / 수정자    / 수정내용
 *     ------------------------------------------
 *     2021-09-12 / mitw   / 최초 생성
 * </pre>
 *
 * @since 2021-09-12
 * @param maxPixel String : 최대사이즈
 * @param criteria String : 리사이징 시 최대사이즈의 기준 (가로:width,세로:그 외)
 * @param orgFullPath String : 원본 이미지 파일 경로
 * @param orgFileName String : 원본 이미지 파일명
 * @param resizeFullPath String : 리사이징된 이미지 파일 저장 경로
 * @param resizeFileName String : 리사이징된 이미지 파일명
 * @param resizeType String : 리사이징 타입 (crop, normal)
 * @exception IOException : 원본 이미지에 대한 문제가 발생한 경우
 * */
public static void copyResizeImageRatioCriteria(int maxPixel, String criteria, String orgFullPath, String orgFileName, String resizeFullPath, String resizeFileName, String resizeType) throws IOException {
    //이미지 캐시를 사용하지 않는다.
    //사용을 원하면 tmp경로를 완벽하게 구성하거나, VM option에 -Djava.io.tmpdir=/path/to/tmpdir를 추가한다.
    ImageIO.setUseCache(false);
    //원본 파일을 불러온다.
    BufferedImage originalImg = ImageIO.read(new File(orgFullPath + File.separator + orgFileName));
    //원본 이미지의 가로와 세로 사이즈를 가져온다.
    int originWidth = originalImg.getWidth(), width;
    int originHeight = originalImg.getHeight(), height;

    boolean isWidth = criteria.toLowerCase(Locale.ROOT).equals("width");

    //리사이징할 이미지의 기준을 정한다. 가로 기준인지 세로 기준인지
    //기준의 최고 픽셀보다 원본이 큰지 작은지
    if(isWidth) {
        if (originWidth > maxPixel) {
            height = (originHeight * maxPixel) / originWidth;
            width = maxPixel;
        } else {
            height = originHeight;
            width = originWidth;
        }
    } else {
        if (originHeight > maxPixel) {
            height = maxPixel;
            width = (originWidth * maxPixel) / originHeight;
        } else {
            height = originHeight;
            width = originWidth;
        }
    }
    BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    //중앙을 중심으로 CROP 형태로 저장할 지, 일반형태로 저장할 지
    if(resizeType.toLowerCase(Locale.ROOT).equals("crop")) {
        int[] centerPoint = {originalImg.getWidth() / 2, originalImg.getHeight() / 2};
        Graphics2D graphics2D = newImage.createGraphics();
        graphics2D.setBackground(Color.WHITE);
        graphics2D.setPaint(Color.WHITE);
        graphics2D.fillRect(0, 0, width, height);
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.drawImage(originalImg, 0, 0, width, height, 
                centerPoint[0] - (int) (width / 2), centerPoint[1] - (int) (height / 2), 
                centerPoint[0] + (int) (width / 2), centerPoint[1] + (int) (height / 2), null);
    } else {
        Image resizeImage = originalImg.getScaledInstance(width, height, Image.SCALE_SMOOTH);
        Graphics graphics = newImage.getGraphics();
        graphics.drawImage(resizeImage, 0, 0, null);
        graphics.dispose();
    }
    // 이미지 저장
    String[] fileNameArr = resizeFileName.split("\\.");
    File newImgFile = new File(resizeFullPath + resizeFileName);
    FileOutputStream fileOutputStream = new FileOutputStream(newImgFile);
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    ImageIO.write(newImage, fileNameArr[fileNameArr.length - 1], output);
    fileOutputStream.write(output.toByteArray());
}

자세한 주요 내용은 소스코드 내 javaDoc에 존재함.

 

 

 자, 이런 말도 안되는 사기.주작같은 억울할 것 같지만 웃고 있는 사람의 사진이 존재한다고 가정하면. 

 

normal 방식은 일반적으로 이미지의 전체적인 그림을 유지하면서 작게 만드는 방식.

작아졌다고, 덜 억울하냐

crop 방식은 이미지의 중심점을 기준으로 리사이징을 하는 방식

눈이 문제가 아니었네. 얼굴이 발.. 그레

 

항상 밝고 노력하는 모습이 가장 멋있는 조세호!

 

 

 

댓글