[ÆÁ] À̹ÌÁö Å©±â º¯È¯ÇÒ ¶§ Ç°Áú À¯ÁöÇϱâ
ÀÚ¹Ù¿¡¼ À̹ÌÁöÀÇ Å©±â¸¦ º¯È¯ÇÒ ¶§ Ç°ÁúÀ» À¯ÁöÇÏ´Â ¹æ¹ýÀ» »ìÆ캻´Ù.
À̹ÌÁö Å©±â º¯È¯½Ã Ç°Áú À¯Áö ¹æ¹ý
ÇÊÀÚ°¡ ¾´ 'JSP 2.0 ÇÁ·Î±×·¡¹Ö' Ã¥¿¡¼ ÀÚ¹Ù 1.4ºÎÅÍ Ãß°¡µÈ ImageIO Ŭ·¡½º¸¦ »ç¿ëÇؼ ½æ³×ÀÏ À̹ÌÁö¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÑ ¹Ù ÀÖ´Ù. ÀÌ ¶§ ¼Ò°³ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
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() ÇÔ¼ö¸¦ ÅëÇؼ ´ÙÀ½°ú °°ÀÌ Å©±â º¯È¯À» ÇÏ¸é º¯È¯µÈ À̹ÌÁöÀÇ Ç°ÁúÀÌ ¶³¾îÁöÁö ¾Ê°Ô µÇ¾ú´Ù.
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 À̹ÌÁö¸¦ ÀúÀåÇÒ ¶§ »ç¿ëµÇ´Â ¹æ½Ä ¶§¹®ÀÎ °ÍÀ¸·Î ÆǴܵȴÙ.)
±×·±µ¥, ImageIconÀÇ °æ¿ì´Â GIF¿Í JPEG Æ÷¸ËÀÇ À̹ÌÁö¸¸ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡, BMP³ª PNG °°Àº ÆÄÀÏÀº ImageIconÀ¸·Î Àоî¿Ã ¼ö°¡ ¾ø´Ù. µû¶ó¼, ´ÙÀ½°ú °°ÀÌ À̹ÌÁö Æ÷¸Ë¿¡ µû¶ó¼ ¼·Î ´Ù¸¥ ¹æ½ÄÀ¸·Î À̹ÌÁö¸¦ ·ÎµùÇϵµ·Ï ÇÏ¿´´Ù.
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 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]