> Hello World !!!

     

@syaku

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

728x90
반응형

written by Seok Kyun. Choi. 최석균

 자바용 이미지 썸네일


[참고사항] 

2014/04/03 - [플렛폼/윈도우 응용프로그램] - 자바 이미지 썸네일 만들기 : ImageMagick JAVA Image Thumbnail


자바용 이미지 썸네일을 구현하기 위해 필요한 라이브러리는 AWT 와 JAI 가 있다.

JAI 는 다양한 기능이 있긴 하지만, 공개된 정보나 지식이 많이 없으므로, 직접 개발하면서 익혀야 하는 문제가 있다.


자바용 썸네일을 검색해보면 많은 분들이 JAI 로 개발을 했는 데, 그 소스는 2MB 용량의 고해상도 이미지에서는 오류가 발생하는 문제가 있다. 왜 이문제를 지적하지 않았는 지~ 아;; 뭐 나만 그럴수도 있는 문젠가? 하고 말았다.;;;
여튼 해결책을 찾지 못해서 걍 JAI 라이브러리는 포기하고 AWT 만 사용해 개발하였다.

그리고 GIF 용 이미지는 AnimatedGifEncoder,GifDecoder 를 사용하였다.

테스트 한 이미지 확장자 : PNG , JPG , BMP , GIF

AnimatedGifEncoder.javaGifDecoder.java
[결과물]

변경전과 변경후 화질은 썩 좋지않다...

 
 


 ImageUtils

* 본인 환경에 맞게 수정하여 사용하세요~

/*
 * 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);


posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.

http://syaku.tistory.com

728x90
반응형