자바 이미지 썸네일 만들기 : JAVA Image Thumbnail

[참고사항]
2014/04/03 - [플렛폼/윈도우 응용프로그램] - 자바 이미지 썸네일 만들기 : ImageMagick JAVA Image Thumbnail
JAI 는 다양한 기능이 있긴 하지만, 공개된 정보나 지식이 많이 없으므로, 직접 개발하면서 익혀야 하는 문제가 있다.
자바용 썸네일을 검색해보면 많은 분들이 JAI 로 개발을 했는 데, 그 소스는 2MB 용량의 고해상도 이미지에서는 오류가 발생하는 문제가 있다. 왜 이문제를 지적하지 않았는 지~ 아;; 뭐 나만 그럴수도 있는 문젠가? 하고 말았다.;;;
여튼 해결책을 찾지 못해서 걍 JAI 라이브러리는 포기하고 AWT 만 사용해 개발하였다.
그리고 GIF 용 이미지는 AnimatedGifEncoder,GifDecoder 를 사용하였다.
테스트 한 이미지 확장자 : PNG , JPG , BMP , GIF
AnimatedGifEncoder.java
GifDecoder.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 |
