문제

제가 작업 중인 시스템에는 다음을 사용하여 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을 통해 사용할 수 있습니다.

http://search.maven.org/#search%7cga%7c1%7cdrewnoakes

다른 팁

나는 최근에 메타 데이터 조작 부분을 코딩하는 데 시간을 보냈습니다. 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). 그것은 가능한 다양한 출력 형식을 허용 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top