2012년 10월 25일 목요일

java Thumbnail

오랜만에 포스팅...
Thumbnail image 만들기를 하면서 구글링결과 그대로 쓰기는 무리가 있었고,
역시 짜집기 국가대표급 능력으로 여러 소스를 분석하여 드디어 완성.

필요한 기능은 간단.
1. 원본 파일
2, 저장될 파일
3. 넓이

3이 가장 중요하다.
이유는 간단. Thumbnail image의 원본에 비율이 다르다는것.

그래서 결국 저장될 이미지의 최대치만 지정하면 원본 이미지의 비율에 맞춰 높이를 자동으로 저장한다는 것.

그 소스는....

Image inImage = new ImageIcon(loadFile).getImage();
double scale = (double) maxDim / (double) inImage.getHeight(null);
if (inImage.getWidth(null) > inImage.getHeight(null)) {
  scale = (double) maxDim / (double) inImage.getWidth(null);
}
int scaledW = (int) (scale * inImage.getWidth(null));
int scaledH = (int) (scale * inImage.getHeight(null));

loadFile - 원본 이미지 파일 전체경로 및 파일명(ex: c:\file\test.jpg)
scaledW - 수정된 넓이
scaledH  - 수정된 높이

파일을 저장하는 소스도 문제가 있었다.
문제의 소스

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
encoder.encode(outImage);


표준이 아니어서 jdk버전을 탄다는것...ㅡㅡ;;;

그래서 완성된 소스는...

public boolean createThumbnail(String loadFile, String saveFile, int maxDim)
   throws IOException {
  File save = new File(saveFile.replaceAll("/", "\\" + File.separator));
  FileInputStream fis = new FileInputStream(loadFile.replaceAll("/", "\\"
    + File.separator));
  BufferedImage im = ImageIO.read(fis);

  Image inImage = new ImageIcon(loadFile).getImage();
  double scale = (double) maxDim / (double) inImage.getHeight(null);
  if (inImage.getWidth(null) > inImage.getHeight(null)) {
   scale = (double) maxDim / (double) inImage.getWidth(null);
  }

  int scaledW = (int) (scale * inImage.getWidth(null));
  int scaledH = (int) (scale * inImage.getHeight(null));

  BufferedImage thumb = new BufferedImage(scaledW, scaledH,
    BufferedImage.TYPE_INT_RGB);
  Graphics2D g2 = thumb.createGraphics();

  g2.drawImage(im, 0, 0, scaledW, scaledH, null);
  return ImageIO.write(thumb, "jpg", save);
 }


loadFile - 원본 이미지 파일 전체경로 및 파일명(ex: c:\file\test.jpg)
saveFile - 저장될 이미지 파일 전체경로 및 파일명(ex: c:\file\test_300.jpg)
maxDim - 저장될 이미지의 최대 pixel(ex:300)

여기서 다 알겠지만 간단한 팁은.
만약 넓이와 높이가 지정되는 경우라면 scaledW, scaledH 를 계산하지 않고 직접 지정하면 된다는거다.

java Thumbnail 소스를 찾다거 맨붕 오신 분들에게 한방울의 생명수가 되길 바라며.

블로그 통계를 보니 외쿡에서도 간혹 들어온다.
그래서 의도적으로 ex를...ㅋㅋㅋ

#SCMInno #에스씨엠이노 #WEBDeK

댓글 2개:

Unknown :

이거 쓰고 날라갔는데... 쩝!!!
Thumbnail 관련된 이슈가 간간히 있지...
이것을... Source Level에서 처리 하지말고..
미리보기 서버 등을 구성하는 것도 생각해보면 좋을 거 같어...

그리고 이미지뿐 아니라... 문서나 도면도 이렇게 Thumbnail이 필요하다는 거지... 헐헐헐헐

익명 :

퍼가용~♥