자바 이미지 리사이즈
프로필 이미지를 크롭하여 서버에 전달하는데.. 이미지가 너무 고해상도라 이미지를 잘라도 파일 용량이 커 이미지를 로드하는 시간이 길었다.
원인을 해결하기 위해 서버에서 이미지를 줄여서 로드하는 걸로 했다. 잘 됬는데 톰캣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(); } } }
'Java 개발 이야기' 카테고리의 다른 글
자바 Map 출력하기 (0) | 2018.05.16 |
---|---|
자바 @SuppressWarnings 사용하기 (0) | 2018.05.01 |
자바의 객체 비교 Comparable와 Comparator (0) | 2018.04.18 |
자바 리플렉션(Reflection) 사용 (0) | 2018.04.17 |
자바 리플렉션(Reflection) 개념 (1) | 2018.04.17 |