java resize upload 에 대한 질문

조회수 3717회

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

기존코드


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

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

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)