티스토리 뷰

Java

java 이미지 resize

토마's 2017. 4. 13. 17:59

오늘은 프로젝트를 진행하다가 이미지 사이즈를 줄여야할 경우가 생겨서 여러 사이트를 찾아보면서 만들었던

ImageUtil에 대해서 정리하려고 합니다. 저도 다음에 다시 필요성을 느꼈을때 참조하기 위해서 포스팅하려고 합니다.

두 가지의 ImageUtil을 포스팅하고 필요할 때 커스터마이징해서 상황에 맞게 응용하시면 될 것 같습니다.


case 1)

public class ImageUtil {

private static final int IMG_WIDTH = 600;     // 이미지 width 상황에 맞게 설정
  private static final int IMG_HEIGHT = 700;    // 이미지 height 상황에 맞게 설정

  /**
   * 원본 이미지를 리사이즈 한다.
   * 
   * @param String srcPath 원본 이미지 경로
   * @param String destPath 대상 경로
   * @param String fileName 파일명
   * @param String suffix 확장자 ( .jpg , .png )
   * @throws IOException
   */
  public static void imageResize(String srcPath, String destPath, String fileName, String suffix)
      throws IOException {

    File destFolder = new File(destPath);

    if (!destFolder.exists()) {
      destFolder.mkdirs();
    }

    // File file = new File(srcPath + fileName + suffix);
    BufferedImage originalImage = ImageIO.read(new File(srcPath + fileName + "." + suffix));
    String convertUUID = UUID.randomUUID().toString().replace("-", ""); // 해쉬명 생성

    int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
    BufferedImage resizeImage = resizeImageWithHint(originalImage, type);

    ImageIO.write(resizeImage, suffix.substring(1), new File(destPath + convertUUID + suffix));
  }

  /**
   * 이미지를 리사이즈 한다.
   * 
   * @param File srcFile 원본 이미지 파일
   * @param String destPath 대상 경로
   * @param String hashfileName 해쉬파일명
   * @param String suffix 확장자 ( .jpg , .png )
   * @throws IOException
   */
  public static void imageResize(File srcFile, String destPath, String hashfileName, String suffix)
      throws IOException {

    File destFolder = new File(destPath);

    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, suffix.substring(1), new File(destPath + hashfileName + suffix));
  }


  private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type) {

    BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
    g.dispose();
    g.setComposite(AlphaComposite.Src);

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    return resizedImage;
  }

}


case 2)

public class ImageUtil {

/**
   * 이미지를 리사이즈 한다.
   * 
   * @param String imgsrc 원본 이미지 경로
   * @param String imgdist 대상 경로
   * @param String type 확장자 ( .jpg , .png )
   * @param String fileName 파일명
   * @param int widthdist 리사이즈할 가로사이즈
   * @param int heightdist 리사이즈할 세로사이즈
   * @throws IOException
   */
  public static void reduceImg(String imgsrc, String imgdist, String type, String fileName,
      int widthdist, int heightdist) throws IOException {

    File srcfile = new File(imgsrc + fileName + type);
    File destFolder = new File(imgdist);
    String convertUUID = UUID.randomUUID().toString().replace("-", ""); // 해쉬명 생성

    if (!destFolder.exists()) {
      destFolder.mkdirs();
    }

    Image src = ImageIO.read(srcfile);

    BufferedImage resizeImage =
        new BufferedImage((int) widthdist, (int) heightdist, BufferedImage.TYPE_INT_RGB);

    resizeImage.getGraphics()
        .drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);
    // resizeImage.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,
    // Image.SCALE_AREA_AVERAGING), 0, 0, null);

    FileOutputStream out = new FileOutputStream(imgdist + convertUUID + type);
    ImageIO.write(resizeImage, type.substring(1), out);
    out.close();
  }

  /**
   * 이미지를 리사이즈 한다.
   * 
   * @param File srcFile 업로드된 원본 파일
   * @param String destPath 새로 저장할 파일 경로
   * @param String type 확장자 ( .jpg , .png 등 )
   * @param String hashfileName 해쉬파일
   * @param int widthdist 리사이즈할 가로사이즈
   * @param int heightdist 리사이즈할 세로사이즈
   * @throws IOException
   */
  public static void resizeImg(File srcFile, String destPath, String type, String hashfileName,
      int widthdist, int heightdist) throws IOException {

    File destFolder = new File(destPath);
    if (!destFolder.exists()) { // 폴더 없으면 생성
      destFolder.mkdirs();
    }

    Image src = ImageIO.read(srcFile);

    BufferedImage resizeImage =
        new BufferedImage((int) widthdist, (int) heightdist, BufferedImage.TYPE_INT_RGB);

    resizeImage.getGraphics()
        .drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);
    // resizeImage.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,
    // Image.SCALE_AREA_AVERAGING), 0, 0, null);

    FileOutputStream out = new FileOutputStream(destPath + hashfileName + type);
    ImageIO.write(resizeImage, type.substring(1), out);
    out.close();
  }
}


그리고 마지막으로 MultipartFile을 File로 변환하는 method는 다음과 같다.

/**
   * multipartFile을 File로 변환한다.
   * 
   * @param MultipartFile file 멀티파트 파일
   * @return File 변환된 파일을 반환한다.
   * @throws IOException
   */
  public static File multipartFileToFile(MultipartFile file) throws IOException {

    File convFile = new File(file.getOriginalFilename());
    convFile.createNewFile();
    FileOutputStream fos = new FileOutputStream(convFile);
    fos.write(file.getBytes());
    fos.close();

    return convFile;
  }


이것으로, 이미지를 받으면, 해당 이미지의 사이즈를 늘리거나 줄이는 util에 대해서 포스팅했습니다.

다음에 기회가 된다면 이미지 해상도를 낮추거나 높이는 util에 대해서 포스팅할 수 있도록 찾아보겠습니다.

아직, 많이 부족해서 더 좋은 방법이 있으면 그 방법으로 하시는걸 추천드립니다. :) 


이것으로 오늘의 포스팅은 마치도록 하겠습니다.