java resize upload 에 대한 질문

조회수 2686회

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

기존코드


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

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

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 형태의 이미지를 저장하고 싶습니다.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.