2016년 11월 23일

Thumbnailator 을 이용한 섬네일 이미지 생성하기

간단하게 섬네일 이미지를 생성하고자 하는 경우 Thumbnailator 를 사용하면 손쉽게 구현이 가능하다.

Thumbnailator 는 자바 1.5 이상이면 사용이 가능하다.

1. Maven 에서 Thumbnailator 사용하기  


pom.xml 파일의 dependencies 항목에 아래와 같이 추가한다.


  net.coobird
  thumbnailator
  [0.4, 0.5)


2. 자바에서 섬네일 이미지 생성하기

이제 아래와 같이 사용하면 된다. 

Thumbnails.of(new File("original.jpg"))
        .size(160, 160)
        .toFile(new File("thumbnail.jpg"));
다만 일부 OS 에서는 섬네일 이미지가 0 크기로 생성되는 오류가 발생된다. (Mac 과 Windows 에서는 대부분 동작) . 이런 문제를 해결하기 위하여 아래와 같이  javax.imageio 을 함께 사용하여 문제를 해결하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.imageio.ImageIO;
 
public class ThumbnailMaker {
 
    private Lock lock = new ReentrantLock();
 
    public File getThumbnailImage(File image, int width, int height) {
        try {
            
            lock.lock();
            
            File dir = File("/thumbnails");  // Thumbnail 이미지를 저장할 장소 
            File file = new File(dir, toThumbnailFilename(attachment, width, height));             
            
            BufferedImage thumbnail = Thumbnails.of(image).size(width, height).asBufferedImage();
            ImageIO.write(thumbnail, "png", file);
            //
            //Thumbnails.of(image).allowOverwrite(true).size(width, height).outputFormat("png").toOutputStream(new FileOutputStream(file));                
            //
            return file;
        } catch (IOException e) {
            throw new NotFoundException(e);
        } finally {
            lock.unlock();
        }
    }
    protected String toThumbnailFilename(File file, int width, int height) {        
        StringBuilder sb = new StringBuilder();
        sb.append( file.getName() ).append("_").append(width).append("_").append(height).append(".png");
        return sb.toString();
    }
    
 
}
cs

댓글 없음:

댓글 쓰기