2011년 11월 2일 수요일

DB의 BLOB 타입으로 저장된 이미지를 출력해 보자.


http://blog.kimkoon.net/1007

파일 이미지를 다루는 방식은 인터넷에 많은데
이번에 Byte[]로 받아 처리하는 방식에 대해 정리 차원에서 기록해보자.


ibatis에서 BLOB 타입을 받아 처리하려면 설정해주어야 할 문제가 있다.
(자세한 사항은 http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Ibatisclobblob  ,
http://blog.naver.com/PostView.nhn?blogId=mispro97&logNo=20053634922
참고) 


. applicationContext.xml 소스 추가

이렇게 applicationContext.xml 파일에 추가해주어야 ibatis에서 BLOB 타입을 처리해준다고 한다.
(역시, 위의 링크와 동일하게 자세한 사항은 http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Ibatisclobblob ,
http://www.java2s.com/Code/Java/Spring/SetupDataSourceforMySQL.htm  
참고) 


더보기




 2. 이미지를 byte[]로 받아 출력해 보자


@RequestMapping("/ShowImage")
public void showImage( @RequestParam("imgIdx") String imgIdx
                      ,HttpServletResponse response
                      ,HttpServletRequest request) throws Exception  {
    
    InputStream is = null;
    byte[] bytes;
    
    /* 저는 jpg 파일로 고정이라 이렇게 했지만 여러분은 타입을 얻어와야 한다. */
    String content_type = "image/jpeg";
    response.setContentType(content_type);  // Content Type Set
    
    /* DB의 BLOB 타입의 내용을 가져와서 bytes 변수에 담아보자. */
    Master master = new Master();
    master = MasterMgr.getMasterImg(imgIdx);
    bytes = master.getBlobTypeImage();

    /* String --> InputStream 타입으로 변환 */
    is = new ByteArrayInputStream(bytes);
    
    
    /* 이제 OutputStream 으로 출력해보자*/
    ServletOutputStream os = response.getOutputStream();
    
    int binaryRead;
    
    while ((binaryRead = is.read()) != -1) {
        os.write(binaryRead);
    }
    
}


3. 이미지를 Resize해서 출력해 보자
( 출처 : http://blog.naver.com/PostView.nhn?blogId=ppant&logNo=70107766793 )
@RequestMapping("/ShowImage")
public void showImage( @RequestParam("imgIdx") String imgIdx
                      ,HttpServletResponse response
                      ,HttpServletRequest request) throws Exception  {
    
    InputStream is = null;
    byte[] bytes;
    
    /* 저는 jpg 파일로 고정이라 이렇게 했지만 여러분은 타입을 얻어와야 한다. */
    String content_type = "image/jpeg";
    response.setContentType(content_type);  // Content Type Set
    
    /* DB의 BLOB 타입의 내용을 가져와서 bytes 변수에 담아보자. */
    Master master = new Master();
    master = MasterMgr.getMasterImg(imgIdx);
    bytes = master.getBlobTypeImage();

    /* String --> InputStream 타입으로 변환 및 가로:100px, 비율:1 에 맞추어 Resize */
    is = new ByteArrayInputStream(generateImage(bytes, 100, 1));
    
    
    /* 이제 OutputStream 으로 출력해보자*/
    ServletOutputStream os = response.getOutputStream();
    
    int binaryRead;
    
    while ((binaryRead = is.read()) != -1) {
        os.write(binaryRead);
    }
    
}


public static byte[] generateImage( byte[] imageContent
                                   ,int maxWidth
                                   ,double xyRatio) throws IOException {
                                   
    BufferedImage originalImg = ImageIO.read( new ByteArrayInputStream(imageContent));

    //get the center point for crop
    int[] centerPoint = { originalImg.getWidth() /2, originalImg.getHeight() / 2 };

    //calculate crop area
    int cropWidth=originalImg.getWidth();
    int cropHeight=originalImg.getHeight();

    if( cropHeight > cropWidth * xyRatio ) {
        //long image
        cropHeight = (int) (cropWidth * xyRatio);
    } else {
        //wide image
        cropWidth = (int) ( (float) cropHeight / xyRatio) ;
    }

    //set target image size
    int targetWidth = cropWidth;
    int targetHeight = cropHeight;

    if( targetWidth > maxWidth) {
        //too big image
        targetWidth = maxWidth;
        targetHeight = (int) (targetWidth * xyRatio);
    }

    //processing image
    BufferedImage targetImage = new BufferedImage( targetWidth
                                                  ,targetHeight
                                                  ,BufferedImage.TYPE_INT_RGB);
                                                  
    Graphics2D graphics2D = targetImage.createGraphics();
    graphics2D.setBackground(Color.WHITE);
    graphics2D.setPaint(Color.WHITE);
    graphics2D.fillRect(0, 0, targetWidth, targetHeight);
    graphics2D.setRenderingHint( RenderingHints.KEY_INTERPOLATION
                                ,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.drawImage( originalImg, 0, 0
                         ,targetWidth, targetHeight
                         ,centerPoint[0] - (int)(cropWidth /2)
                         ,centerPoint[1] - (int)(cropHeight /2)
                         ,centerPoint[0] + (int)(cropWidth /2)
                         ,centerPoint[1] + (int)(cropHeight /2)
                         ,null);

    ByteArrayOutputStream output = new ByteArrayOutputStream();
    ImageIO.write(targetImage, "png", output);

    return output.toByteArray();
}
    


4. 화면 출력


<img src="/ShowImage.do?imgIdx=007 />

댓글 없음:

댓글 쓰기