Java를 사용하여 tif 파일에서 IPTC/EXIF 데이터 추출
-
13-09-2019 - |
문제
제가 작업 중인 시스템에는 다음을 사용하여 JPEG 파일에서 메타데이터를 추출하는 기능이 있습니다. com.drew.metadata
패키지. http://www.drewnoakes.com/code/exif/ 그러나 이는 JPEG 파일로 제한되며 이제 고객이 TIF 및 기타 이미지 형식에서 IPTC를 추출하는 방법에 대해 문의했습니다.
TIF에서 IPTC를 추출할 수 있는 Drew Noakes와 유사한 API에 대해 아는 사람이 있습니까?
이상적으로 이는 다음과 같은 순수한 Java 접근 방식이 될 것입니다. com.drew.metadata
하나.
해결책
이것은 오래된 질문입니다. 요즘 내 metadata-extractor
라이브러리는 JPEG, Webp, PSD, PNG, GIF, BMP, ICO, PCX 및 많은 카메라 원시 형식뿐만 아니라 TIFF 파일을 지원합니다.
이 프로젝트는 최근 Github로 옮겼습니다.
https://github.com/drewnoakes/metadata-extractor
Maven을 통해 사용할 수 있습니다.
다른 팁
나는 최근에 메타 데이터 조작 부분을 코딩하는 데 시간을 보냈습니다. ICAFE Java 이미지 라이브러리 및 Exif, IPTC, Photoshop, ICC_Profile, 썸네일 등과 같은 메타 데이터 유형을 삽입하고 추출 할 수있게합니다. 일부 기능은 다른 기능보다 낫지 만 모두 비교적 잘 작동합니다. 아래에 표시된 모든 메타 데이터 판독 값에 대한 일반적인 인터페이스가 있습니다.
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import com.icafe4j.image.meta.Metadata;
import com.icafe4j.image.meta.MetadataEntry;
import com.icafe4j.image.meta.MetadataType;
import com.icafe4j.image.meta.iptc.IPTC;
public class ExtractIPTC {
public static void main(String[] args) throws IOException {
Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(args[0]);
IPTC iptc = (IPTC)metadataMap.get(MetadataType.IPTC);
if(iptc != null) {
Iterator<MetadataEntry> iterator = iptc.iterator();
while(iterator.hasNext()) {
MetadataEntry item = iterator.next();
printMetadata(item, "", " ");
}
}
}
private void printMetadata(MetadataEntry entry, String indent, String increment) {
logger.info(indent + entry.getKey() (StringUtils.isNullOrEmpty(entry.getValue())? "" : ": " + entry.getValue()));
if(entry.isMetadataEntryGroup()) {
indent += increment;
Collection<MetadataEntry> entries = entry.getMetadataEntries();
for(MetadataEntry e : entries) {
printMetadata(e, indent, increment);
}
}
}
}
프로젝트의 "이미지"디렉토리에서 인수로 이미지 "iptc.tif"를 전달하면 다음 정보를 얻을 수 있습니다.
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 6
Dataset value: Bayern
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 11
Dataset value: Deckelstein
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 7
Dataset value: Germany
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 10
Dataset value: Nittendorf
위의 코드는 JPEG 및 TIFF 모두에 대해 작동합니다. 이미지 유형을 자동으로 감지하고 해당 코드를 위임하여 작업을 수행합니다.
참고 : IPTC 데이터가 포함 된 TIFF 파일에 둘 이상의 장소가있을 수 있습니다. 하나는 RichTiffiptC 태그이고 다른 하나는 Photoshop 태그 안에 묻혀 있습니다. 현재 ICAFE는 하나의 IPTC 데이터 만 유지합니다. IPTC 데이터와 RichTiffIPTC 태그가있는 Photoshop 태그가 모두 있으면 RichTiffIPTC 데이터를 유지합니다. 그렇지 않으면, 어떤 태그가 존재하든 IPTC 데이터를 해당 태그에서 유지합니다. 두 곳에서 데이터를 유지하는 데 아무런 문제가 없습니다. 메타 데이터 유형 키를 고유 메타 데이터에 매핑하는 맵 매핑을 사용한 현재 구현. 따라서 하나의 고유 한 메타 데이터 인스턴스 만 유지합니다.
업데이트: ICAFE 이제 richtiffiptc와 Photoshop IRB의 IPTC 데이터를 결합하고 복제물을 제거 할 수 있습니다.
Update2 : ICAFE -Metadata의 모든 메타 데이터 유형의 기본 클래스는 이제 반복 가능한 인터페이스를 구현하여 사용자가 메타 데이터 모음을 반복 할 수 있습니다. 메타 데이터 자체 자체는 복합 패턴을 사용하여 생성되므로 메타 데이터에는 다른 메타 데이터 모음이 포함될 수 있습니다. 각 메타 데이터에는 키와 값 쌍이 포함되어 있습니다. 이 디자인은 메타 데이터 항목의 트리 구조 트래버스를 허용합니다.
여기에 를 사용하는 좋은 예가 있습니다. imageio
여기에서 IPTC에 액세스하려면 lib를 사용하세요.
http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-i-o-api
안타깝게도 일부 작업은 직접 처리해야 합니다.
순수한 Java 구현을 찾을 수없는 경우 imagemagick에 Java 바인딩을 사용하는 것을 고려할 수 있습니다 (Jmagick). 그것은 가능한 다양한 출력 형식을 허용 할 것입니다.