java resize upload 에 대한 질문
조회수 3675회
질문을 하나 드리려고 합니다.
기존코드
byte[] photo;
if(upload.isEmpty() == false){
logger.info("-------------Upload file start -------------");
logger.info("name : "+upload.getName());
logger.info("filename : "+upload.getOriginalFilename());
logger.info("size : "+upload.getSize());
logger.info("-------------- file end --------------\n");
photo = upload.getBytes();
upload.getSize();
}else{
logger.info("-------------Camera file start -------------");
logger.info("name : "+camera.getName());
logger.info("filename : "+camera.getOriginalFilename());
logger.info("size : "+camera.getSize());
logger.info("-------------- file end --------------\n");
photo = camera.getBytes();
camera.getSize();
}
byte[] data = photo;
String imgName = "idCard"+ "_" + param.get("sp_no") +".jpg";
String imgPath = "C:/test/";
param.put("imgName", imgName);
FileOutputStream imageout = new FileOutputStream(imgPath + imgName);
imageout.write(data);
imageout.flush();
imageout.close();
return "photo/idCard";
이런식으로 바이트 형태의 이미지를 저장하는 코드인데 여기서 바이트 형태의 photo 이미지를 리사이징하고 싶어서 클래스를 만든 후 리사이징 하려고 하는데 이미지를 String 형태의 절대경로 형태로 받아와서 저장하는 방식인데 제가 사용한 코드는 바이트 형태의 이미지를 서버에 저장하고 싶습니다.
String org_img = "d://IMG_22.jpg";//원본파일경로
String thumb_img = "d://thumb.jpg";//썸네일생성할경로
File src = new File(org_img);
File dest = new File(thumb_img);
ImageUtill.resize(src,dest,400,300);
ImageUtill 클래스를 사용해서 String 형태의 이미지를 리사이징 하는 방식인데 위 코드처럼 byte 형태로 받아오는 형태를 아래 코드에 어떻게 적용시킬지 좀 어려운 부분이 있어서 어떤 식으로 할지 조언 부탁드립니다.
2 답변
-
ImageUtil의 resize를 보면 결국 src파일에서
Image srcImg
를 얻어옵니다.byte[] 형태의 이미지를 다음과 같이 하면 Image로 변환할 수 있으니 resize메소드를 조금 수정해서 사용하시면 되겠네요.
byte[] imageInByte; Image image; try { // convert byte array back to BufferedImage InputStream in = new ByteArrayInputStream(imageInByte); image = ImageIO.read(in); } catch (IOException e) { System.out.println(e.getMessage()); }
- 답변 감사합니다. 버퍼이미지를 이용해서 이미지IO로 받아들이는 메소드는 많이 봤는데 제가 사용법을 몰라서.... 저 코드를 resize 메소드에 추가하면 될까요?? 초보자이다 보니 적용방법을 잘 몰라서 jason 2016.5.12 11:02
- (1) resize에 매개변수로 imageInByte를 전달합니다. 매개변수 명은 imageInByte이어야 합니다. (2) resize의 가장 위에 위의 코드를 넣습니다. (3) Image srcImg = null; 을 Image srcImage = image로 변경합니다. 그리고 나서 파일에서 srcImg를 읽어들이는 부분을 제거하세요. 정토드 2016.5.12 12:02
-
package com.wein.wincos.cc; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.PixelGrabber; import java.io.File;//파일 입출력 관련 import java.io.IOException;//입출력 예외 처리 import javax.imageio.ImageIO; import javax.swing.ImageIcon; public class ImageUtill { //final 이므로 상수처리 public static final int RATIO = 0; public static final int SAME=-1; public static void resize(File src, File dest, int width, int height) throws IOException{//이녀석은 이미지를 썸네일로 만들어주는 메서드 임을 명심!! //src:이미지경로 dest:썸네일 경로 width:가로, height:세로 Image srcImg = null;//클래스 객체화 String suffix = src.getName().substring(src.getName().lastIndexOf('.')+1).toLowerCase(); //suffix변수: src경로의 이름을 얻어 .의 인덱스+1을 하여 문자화 시킨다. 확장자를 뺀 이름 을 구한다. if(suffix.equals("bmp") || suffix.equals("png") || suffix.equals("gif")){ srcImg = ImageIO.read(src); //각 확장자를 설정 해 주고, 해당 확장자 이면 파일을 읽어 온다. }else{ srcImg = new ImageIcon(src.getAbsolutePath()).getImage(); //이녀석은 jpg 전용(ImageIcon메서드 자체가 jpg만 로드 하기 때문에...) } //해당 이미지 크기 int srcWidth = srcImg.getWidth(null); int srcHeight = srcImg.getHeight(null); //해당 썸네일 이미지(없음) int destWidth=-1, destHeight=-1; if(width==SAME){//가로가 0 일 경우 destWidth = srcWidth;//썸네일 이미지는 이미지 크기와 동일하게 한다. }else if(width>0){ destWidth=width;//0보다 크면 썸네일 이미지를 갖는다. } if(height==SAME){//세로가 0일 경우 destHeight = srcHeight;//썸네일 이미지는 이미지 크기와 동일하게 한다. }else if(height>0){ destHeight=height;//0보다 크면 썸네일 이미지를 갖는다. } if(width==RATIO && height==RATIO){//가로세로 비율이 -1 일 경우 destWidth=srcWidth; destHeight=srcHeight; }else if(width==RATIO){ //가로 세로 비율을 일정하게 잡아 준다. double ratio = ((double)destHeight)/((double)srcHeight); destWidth=(int)((double)destHeight*ratio); }else if(height==RATIO){ double ratio = ((double)destWidth)/((double)srcWidth); destHeight=(int)((double)destHeight*ratio); } Image imgTarget = srcImg.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH); //이미지를 깨짐 없이 부드럽게 줄여 줄 수 있게 한다. int pixels[] = new int[destWidth * destHeight]; //전체 픽셀 값을 계산 한다. PixelGrabber pg = new PixelGrabber(imgTarget, 0, 0, destWidth, destHeight, pixels, 0, destWidth); //크기에 따라 이미지도 자연스럽게 줄여 준다. try { pg.grabPixels(); //이미지 줄이기를 실행 하고 } catch (Exception e) { throw new IOException(e.getMessage()); } BufferedImage destImg = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB); destImg.setRGB(0, 0, destWidth, destHeight, pixels, 0, destWidth); //읽어들은 이미지를 ImageIO.write(destImg, "jpg", dest); //썸네일이미지.jpg 형식으로 파일을 생성 한다. } }
ImageUtil 클래스 입니다. 많이 사용하시는 리사이징 방식인데 대부분 String 방식으로 이미지를 경로로 받아와서 사용하는데 저처럼 byte 형태의 이미지를 저장하고 싶습니다.
댓글 입력