본문으로 바로가기

자바 이미지 리사이즈

category Java 개발 이야기 2018. 4. 19. 16:30
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



자바 이미지 리사이즈


프로필 이미지를 크롭하여 서버에 전달하는데.. 이미지가 너무 고해상도라 이미지를 잘라도 파일 용량이 커 이미지를 로드하는 시간이 길었다.

원인을 해결하기 위해 서버에서 이미지를 줄여서 로드하는 걸로 했다. 잘 됬는데 톰캣8에서는 POST로 데이터를 보내는데 크기가 제한이 되어있어 안되는 경우도 있었다. 그래서 안드로이드에서 이미지를 줄이는 것으로 변경.. 그리고 서버에서도 안드로이드에서 리사이즈했지만 그래도 크기가 큰 것같으면 다시 리사이즈 하는걸로 일단 코드를 작성했다.

2가지 방법으로 각각 서버 또는 안드로이드에 적용했다. 어떤 거는 안드로이드에서 안되더라..


일단 두개를 다 코드 올린다.



샘플코드 1

package test11;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Test {
    private static final int IMG_WIDTH = 300;
    private static final int IMG_HEIGHT = 300;
    
    public static void main(String[] args) {
        try {
            String imgOriginalPath = "C:\\Users\\z\\Desktop\\imagetest\\TEST\\1.jpg"; // 원본 이미지 파일명
            String imgTargetPath = "C:\\Users\\z\\Desktop\\imagetest\\TEST\\testimage.png"; // 새 이미지 파일명
            
            File originFile = new File(imgOriginalPath);
            System.out.println("originFile Length : " + originFile.length());
            
            BufferedImage originalImage = ImageIO.read(new File(imgOriginalPath));
            int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
            System.out.println("originFile Height : " + originalImage.getHeight());
            System.out.println("originFile Width : " + originalImage.getWidth());
            
            BufferedImage resizeImagePng = resizeImage(originalImage, type);
            ImageIO.write(resizeImagePng, "png", originFile);
            BufferedImage resigeImage = ImageIO.read(originFile);
            
            System.out.println("===========================================================");
            File resizeFile = new File(imgOriginalPath);
            System.out.println("resizeFile Length : " + resizeFile.length());
            
            System.out.println("resizeFile Height : " + resigeImage.getHeight());
            System.out.println("resizeFile Width : " + resigeImage.getWidth());
            
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
     private static BufferedImage resizeImage(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();
            
        return resizedImage;
    }

}

샘플코드2

package test11; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class TEST2 { public static void main(String[] args) { String imgOriginalPath= "C:\\Users\\z\\Desktop\\imagetest\\TEST\\1.jpg"; // 원본 이미지 파일명 String imgTargetPath= "C:\\Users\\z\\Desktop\\imagetest\\TEST\\2.jpg"; // 새 이미지 파일명 String imgFormat = "png"; int newWidth = 600; int newHeight = 600; Image image; int imageWidth; int imageHeight; try{ // 원본 이미지 가져오기 image = ImageIO.read(new File(imgOriginalPath)); // 원본 이미지 사이즈 가져오기 imageWidth = image.getWidth(null); imageHeight = image.getHeight(null); System.out.println("imageWidth : " + imageWidth); System.out.println("imageHeight : " + imageHeight); // 이미지 리사이즈 // Image.SCALE_DEFAULT : 기본 이미지 스케일링 알고리즘 사용 // Image.SCALE_FAST : 이미지 부드러움보다 속도 우선 // Image.SCALE_REPLICATE : ReplicateScaleFilter 클래스로 구체화 된 이미지 크기 조절 알고리즘 // Image.SCALE_SMOOTH : 속도보다 이미지 부드러움을 우선 // Image.SCALE_AREA_AVERAGING : 평균 알고리즘 사용 Image resizeImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); System.out.println("reimageWidth : " + resizeImage.getWidth(null)); System.out.println("reimageHeight : " + resizeImage.getHeight(null)); // 새 이미지 저장하기 BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); Graphics g = newImage.getGraphics(); g.drawImage(resizeImage, 0, 0, null); g.dispose(); ImageIO.write(newImage, imgFormat, new File(imgTargetPath)); }catch (Exception e){ e.printStackTrace(); } } }