자바 이미지 썸네일 만들기 : JAVA Image Thumbnail
[참고사항]
2014/04/03 - [플렛폼/윈도우 응용프로그램] - 자바 이미지 썸네일 만들기 : ImageMagick JAVA Image Thumbnail
JAI 는 다양한 기능이 있긴 하지만, 공개된 정보나 지식이 많이 없으므로, 직접 개발하면서 익혀야 하는 문제가 있다.
자바용 썸네일을 검색해보면 많은 분들이 JAI 로 개발을 했는 데, 그 소스는 2MB 용량의 고해상도 이미지에서는 오류가 발생하는 문제가 있다. 왜 이문제를 지적하지 않았는 지~ 아;; 뭐 나만 그럴수도 있는 문젠가? 하고 말았다.;;;
여튼 해결책을 찾지 못해서 걍 JAI 라이브러리는 포기하고 AWT 만 사용해 개발하였다.
그리고 GIF 용 이미지는 AnimatedGifEncoder,GifDecoder 를 사용하였다.
테스트 한 이미지 확장자 : PNG , JPG , BMP , GIF
AnimatedGifEncoder.javaGifDecoder.java
[결과물]
변경전과 변경후 화질은 썩 좋지않다...
* 본인 환경에 맞게 수정하여 사용하세요~
/* * ImageUtils.java 2011.02.15 * * Copyright (c) 2010, MEI By Seok Kyun. Choi. (최석균) * http://syaku.tistory.com * * GNU Lesser General Public License * http://www.gnu.org/licenses/lgpl.html */ package com.syaku.util; import java.io.*; import org.apache.log4j.Logger; import org.apache.commons.lang.*; import java.awt.Image; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import com.syaku.common.AnimatedGifEncoder; import com.syaku.common.GifDecoder; public class ImageUtils { private static Logger log = Logger.getLogger(ImageUtils.class); public static void createThumbnail(String load,String save,String type,int w,int h) { try { BufferedInputStream stream_file = new BufferedInputStream(new FileInputStream(load)); createThumbnail(stream_file,save,type,w,h); } catch (Exception e) { log.error(e); } } public static void createThumbnail(BufferedInputStream stream_file,String save,String type,int w,int h) { try { if (StringUtils.equals(StringUtils.lowerCase(type),"gif")) { getGifImageThumbnail(stream_file,save,type,w,h); } else { getImageThumbnail(stream_file,save,type,w,h); } } catch (Exception e) { log.error(e); } } public static void getImageThumbnail(BufferedInputStream stream_file,String save,String type,int w,int h) { try { File file = new File(save); BufferedImage bi = ImageIO.read(stream_file); int width = bi.getWidth(); int height = bi.getHeight(); if (w < width) { width = w; } if (h < height) { height = h; } BufferedImage bufferIm = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Image atemp = bi.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING); Graphics2D g2 = bufferIm.createGraphics(); g2.drawImage(atemp, 0, 0, width, height, null); ImageIO.write(bufferIm, type, file); } catch (Exception e) { log.error(e); } } public static void getGifImageThumbnail(BufferedInputStream stream_file,String save,String type,int w,int h) { GifDecoder dec = new GifDecoder(); AnimatedGifEncoder enc = new AnimatedGifEncoder(); dec.read(stream_file); int cnt = dec.getFrameCount(); int delay = 0; int width = 0; int height = 0; try{ enc.start(save); enc.setRepeat(0); for (int i = 0; i < cnt; i++) { BufferedImage frame = dec.getFrame(i); delay = dec.getDelay(i); width = frame.getWidth(); height = frame.getHeight(); if (w < width) { width = w; } if (h < height) { height = h; } BufferedImage destimg = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g = destimg.createGraphics(); g.drawImage(frame, 0, 0, width, height, null); enc.setDelay(delay); enc.addFrame(destimg); } enc.finish(); }catch(Exception ex){ log.error(ex); } } }
// 리눅스(유닉스) 일 경우 경로 구분을 / 로 사용해야 함. 윈도우인 경우 \ 사용해야 함.
String load = "D:\\test\\1212.jpg";
String save = "D:\\test\\test.jpg";
String type = "jpg";
int w = 100;
int h = 100;
// 실제파일,썸네일생성파일,파일확장자명,넓이크기,높이크기
ImageUtils.createThumbnail(load,save,type,w,h);
'개발노트 > JAVA' 카테고리의 다른 글
오픈API 시작하며 #1 OpenAPI , JSON , XML , HTTP , OAuth (4) | 2012.04.09 |
---|---|
자바 XPath 라이브러리 jxpath : Apache jxpath (0) | 2012.02.24 |
트위터 API 인증 : twitter api OAuth Twitter4j (1) | 2011.10.18 |
다양한 문자 조합을 이용한 카운팅 구하기 (0) | 2010.10.20 |