java resize upload 에 대한 질문


질문을 하나 드리려고 합니다.

기존코드


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 형태로 받아오는 형태를 아래 코드에 어떻게 적용시킬지 좀 어려운 부분이 있어서 어떤 식으로 할지 조언 부탁드립니다.

  • 2016년 06월 01일에 수정됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.
  • 2016년 05월 10일에 작성됨

  • 사용하시는 ImageUtil이 뭔지 알아야 답변이 가능할 것 같습니다.    정두식   2016.5.10 22:11     
  • 답변 감사드립니다. 밑에 소스 올려두었습니다.    jason   2016.5.11 09:22     
  • 이렇게 하는게 맞는건가요?    jason   2016.5.11 14:54     
조회수 370


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());
}

출처

  • 2016년 05월 11일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 답변 감사합니다. 버퍼이미지를 이용해서 이미지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 형태의 이미지를 저장하고 싶습니다.

  • 2016년 05월 11일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close