CORE
HOME > JAVA > J2SE > CORE
2017.05.22 / 17:57

[ÆÁ] À̹ÌÁö Å©±â º¯È¯ÇÒ ¶§ Ç°Áú À¯ÁöÇϱâ

ducati
Ãßõ ¼ö 288

ÀÚ¹Ù¿¡¼­ À̹ÌÁöÀÇ Å©±â¸¦ º¯È¯ÇÒ ¶§ Ç°ÁúÀ» À¯ÁöÇÏ´Â ¹æ¹ýÀ» »ìÆ캻´Ù.

À̹ÌÁö Å©±â º¯È¯½Ã Ç°Áú À¯Áö ¹æ¹ý

ÇÊÀÚ°¡ ¾´ 'JSP 2.0 ÇÁ·Î±×·¡¹Ö' Ã¥¿¡¼­ ÀÚ¹Ù 1.4ºÎÅÍ Ãß°¡µÈ ImageIO Ŭ·¡½º¸¦ »ç¿ëÇؼ­ ½æ³×ÀÏ À̹ÌÁö¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÑ ¹Ù ÀÖ´Ù. ÀÌ ¶§ ¼Ò°³ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

    public static void resize(File src, File dest, 
                              int width, int height) throws IOException {
        BufferedImage srcImg = ImageIO.read(src);
        
        int srcWidth = srcImg.getWidth();
        int srcHeight = srcImg.getHeight();
        ...
        BufferedImage destImg = new BufferedImage(
             destWidth, destHeight, BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g = destImg.createGraphics();
        g.drawImage(srcImg, 0, 0, destWidth, destHeight, null);
        
        ImageIO.write(destImg, "jpg", dest);
    }


ÇÊÀÚ´Â ÃÖ±Ù¿¡ À̹ÌÁö °ü·Ã ¼­ºñ½º¸¦ °³¹ßÇÏ°í Àִµ¥, ½æ³×ÀÏ À̹ÌÁö¸¦ ºñ·ÔÇÏ¿© ¿øº» À̹ÌÁöº¸´Ù ÀÛÀº Å©±âÀÇ À̹ÌÁö¸¦ ¸î °³ »ý¼ºÇÒ ÇÊ¿ä°¡ À־ À§¿Í °°Àº Äڵ带 »ç¿ëÇÏ¿´´Ù. À§ ÄÚµå´Â ºñ±³Àû ºü¸¥ ¼Óµµ·Î À̹ÌÁö Å©±â º¯È¯À» ó¸®ÇßÁö¸¸, »õ·Ó°Ô »ý¼ºµÈ À̹ÌÁöÀÇ Ç°ÁúÀÌ ¶³¾îÁø´Ù´Â ¹®Á¦Á¡À» ¹ß°ßÇÏ°Ô µÇ¾ú´Ù.

À̹ÌÁö Ç°ÁúÀ» ³ôÀ̱â À§ÇØ Ã£¾Æ³½ ÇØ°áÃ¥Àº Image.getScaledInstance(int width, int height, int hints) ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â °ÍÀ̾ú´Ù. ·ÎµùÇÑ À̹ÌÁö¸¦ getScaledInstance() ÇÔ¼ö¸¦ ÅëÇؼ­ ´ÙÀ½°ú °°ÀÌ Å©±â º¯È¯À» ÇÏ¸é º¯È¯µÈ À̹ÌÁöÀÇ Ç°ÁúÀÌ ¶³¾îÁöÁö ¾Ê°Ô µÇ¾ú´Ù.

    BufferedImage srcImg = ImageIO.read(src);
    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(); // JEPG Æ÷¸ËÀÇ °æ¿ì ¿À·£ ½Ã°£ÀÌ °É¸°´Ù.
    } catch (InterruptedException 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); 
    


À§ ÄÚµå¿Í °°ÀÌ getScaledInstance() ¸Þ¼ÒµåÀÇ ¼¼¹ø° ÆĶó¹ÌÅÍ·Î Image.SCALE_SMOOTH¸¦ »ç¿ëÇÏ¸é »õ·Ó°Ô »ý¼ºµÈ À̹ÌÁöÀÇ Ç°ÁúÀÌ ¶³¾îÁöÁö ¾Ê°Ô µÈ´Ù. getScaledInstance() ¸Þ¼Òµå°¡ »ý¼ºÇÑ Image °´Ã¼·ÎºÎÅÍ Çȼ¿ Á¤º¸¸¦ Àоî¿Â µÚ, »õ·Ó°Ô »ý¼ºÇÑ BufferedImage¿¡ ä¿ö ³Ö¾îÁÖ¸é À̹ÌÁö Å©±â º¯È¯ÀÌ ¸¶¹«¸® µÈ´Ù.

±×·±µ¥, À̹ÌÁö º¯È¯ °úÁ¤¿¡¼­ ÇÑ°¡Áö ¹®Á¦°¡ ¹ß»ýÇÏ¿´´Ù. ±×°ÍÀº ¹Ù·Î PNG, GIF, BMP¿Í ´Þ¸® JPEG Æ÷¸ËÀ» º¯È¯ÇÒ ¶§´Â PixelGrabber.granPixels() ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¶§ ½Ã°£ÀÌ ¿À·¡ °É¸°´Ù´Â °ÍÀ̾ú´Ù. (À̹ÌÁö Å©±â°¡ 3000*2000ÀÎ °æ¿ì 3ºÐ ÀÌ»ó ¼Ò¿äµÇ±âµµ Çß´Ù.) ±×·¡¼­ ¸î°¡Áö Å×½ºÆ® ³¡¿¡ ´ÙÀ½°ú °°ÀÌ ImageIcon Ŭ·¡½º¸¦ »ç¿ëÇؼ­ JPEG À̹ÌÁö¸¦ ·ÎµùÇÒ °æ¿ì ¿À·£ ó¸® ½Ã°£ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù´Â °É ¾Ë°Ô µÇ¾ú´Ù. (¿Ö JPEGÀ» »ç¿ëÇÒ ¶§ ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÁöÀÇ ¹®Á¦´Â ¾ÆÁ÷ Á¤È®ÇÏ°Ô ÆľÇÇÏÁö ¸øÇßÀ¸³ª, BufferedImage°¡ JEPG À̹ÌÁö¸¦ ÀúÀåÇÒ ¶§ »ç¿ëµÇ´Â ¹æ½Ä ¶§¹®ÀÎ °ÍÀ¸·Î ÆǴܵȴÙ.)

    Image srcImg = new ImageIcon(src.toURL()).getImage(); // JPEG Æ÷¸ËÀΠ°æ¿ì


±×·±µ¥, ImageIconÀÇ °æ¿ì´Â GIF¿Í JPEG Æ÷¸ËÀÇ À̹ÌÁö¸¸ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡, BMP³ª PNG °°Àº ÆÄÀÏÀº ImageIconÀ¸·Î Àоî¿Ã ¼ö°¡ ¾ø´Ù. µû¶ó¼­, ´ÙÀ½°ú °°ÀÌ À̹ÌÁö Æ÷¸Ë¿¡ µû¶ó¼­ ¼­·Î ´Ù¸¥ ¹æ½ÄÀ¸·Î À̹ÌÁö¸¦ ·ÎµùÇϵµ·Ï ÇÏ¿´´Ù.

    Image srcImg = null;
    String suffix = src.getName().substring(src.getName().lastIndexOf('.')+1).toLowerCase();
    if (suffix.equals("bmp") || suffix.equals("png") || suffix.equals("gif")) {
        srcImg = ImageIO.read(src);
    } else {
        // JPEG Æ÷¸Ë
        srcImg = new ImageIcon(src.toURL()).getImage();
    }


À§¿Í °°Àº Äڵ带 »ç¿ëÇϸé, JPEGÀÎ °æ¿ì¿¡´Â ImageIconÀ» »ç¿ëÇؼ­ Image¸¦ »ý¼ºÇÏ°í ±× ¿Ü¿¡ °æ¿ì¿¡´Â ImageIO.read()¸¦ »ç¿ëÇؼ­ Image¸¦ Àоî¿À°Ô µÈ´Ù. ÀÌÁ¦ JPEG Æ÷¸Ë¿¡ ´ëÇؼ­ PixelGrabber.granPixels() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´õ¶óµµ ºü¸£°Ô À̹ÌÁö Å©±â º¯È¯À» ¼öÇàÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.

À̹ÌÁö º¯È¯°ú °ü·ÃµÈ ¿ÏÀüÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

    public class ImageUtil {
        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 {
            Image srcImg = null;
            String suffix = src.getName().substring(src.getName().lastIndexOf('.')+1).toLowerCase();
            if (suffix.equals("bmp") || suffix.equals("png") || suffix.equals("gif")) {
                srcImg = ImageIO.read(src);
            } else {
                // BMP°¡ ¾Æ´Ñ °æ¿ì ImageIconÀ» È°¿ëÇؼ­ Image »ý¼º
                // ÀÌ·¸°Ô Çϴ ÀÌÀ¯´Â getScaledInstance¸¦ ÅëÇØ ±¸ÇÑ À̹ÌÁö¸¦
                // PixelGrabber.grabPixels·Î ¸®»çÀÌÁî ÇÒ¶§
                // ºü¸£°Ô Ã³¸®Çϱâ À§ÇÔÀÌ´Ù.
                srcImg = new ImageIcon(src.toURL()).getImage();
            }
            
            int srcWidth = srcImg.getWidth(null);
            int srcHeight = srcImg.getHeight(null);
            
            int destWidth = -1, destHeight = -1;
            
            if (width == SAME) {
                destWidth = srcWidth;
            } else if (width > 0) {
                destWidth = width;
            }
            
            if (height == SAME) {
                destHeight = srcHeight;
            } else if (height > 0) {
                destHeight = height;
            }
            
            if (width == RATIO && height == RATIO) {
                destWidth = srcWidth;
                destHeight = srcHeight;
            } else if (width == RATIO) {
                double ratio = ((double)destHeight) / ((double)srcHeight);
                destWidth = (int)((double)srcWidth * ratio);
            } else if (height == RATIO) {
                double ratio = ((double)destWidth) / ((double)srcWidth);
                destHeight = (int)((double)srcHeight * 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 (InterruptedException 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);
        }
    }


°ü·Ã¸µÅ©:



Ãâó: http://devx.tistory.com/entry/ÆÁ-À̹ÌÁö-Å©±â-º¯È¯ÇÒ-¶§-Ç°Áú-À¯ÁöÇϱâ [Meta Developer Story]