Java를 이용할 경우 기본적으로 com.sun.image.codec.jpeg 패키지에 JPEG 이미지를 핸들링할 수 있는 API들을 제공한다. 따라서 해당 API들을 이용하여 인코딩및 디코딩이 가능하다. 그리고 exit 정보를 추출하는 것도 가능하다.
하지만 괜찮은 샘플이 없는 것이 조금은 아쉬운 부분이었다. 그래서 여러 가지 자료를 찾아보던 중에 com.sun.image.codec.jpeg API와 metadata-extractor-2.3.1.jar 오픈 라이브러리를 이용하여 좀 더 쉽게 원하는 메타데이터를 추출할 수 있어 소개한다.
먼저, metadata-extractor-2.3.1.jar는 다음의 페이지에서 다운받을 수 있다.
자바 개발시 eclipse와 같이 IDE를 사용할 경우에는 쉽게 classpath에 metadata-extractor-2.3.1.jar를 추가하여 사용할 수 있다. 만약 그렇치 않고 콘솔에서 컴파일 및 실행할 경우 metadata-extractor-2.3.1.jar를 classpath에 추가해 주어야 한다.
소스는 매우 간단한다. JPEGImageDecoder API를 사용하여 JPEG Image decoder를 생성한 후, JpegMetadataReader.readMetadata(decodeParam) metadata-extractor-2.3.1.jar에 포함된 API를 사용하기만 하면 된다.
다음은 실제 소스이다.
/**
* JPEGExifExtraction.java
*
* JPEG 이미지의 EXIF 메타데이터를 추출한다.
*
*/
package net.wiseant.util.image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGDecodeParam;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
/**
* @author SangHyup LEE
* @version 1.0
*
*/
public class JPEGExifExtraction {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
if ( args.length != 1 ) {
System.err.println("Usage:java JPEGExifExtraction filepath");
System.exit(0);
}
String filePath = args[0];
JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(new FileInputStream(new File(filePath)));
BufferedImage image = jpegDecoder.decodeAsBufferedImage();
// now you can use the image
JPEGDecodeParam decodeParam = jpegDecoder.getJPEGDecodeParam();
Metadata metadata = JpegMetadataReader.readMetadata(decodeParam);
Iterator directories = metadata.getDirectoryIterator();
while (directories.hasNext()) {
Directory directory = (Directory)directories.next();
// iterate through tags and print to System.out
Iterator tags = directory.getTagIterator();
while (tags.hasNext()) {
Tag tag = (Tag)tags.next();
// use Tag.toString()
System.out.println(tag);
}
}
}
}
댓글 없음:
댓글 쓰기