2013-10-15 2 views
3

Java에서 작성중인 TIFF 파일에 GPS 데이터를 추가하려고합니다. JAI-ImageIO 라이브러리를 사용하고 있지만, GPS 메타 데이터와 사용자 정의 메타 데이터 모두를 수행 할 수있는 더 나은 라이브러리가있는 경우 조사 할 의향이 있습니다.Java의 TIFF에 GPS 메타 데이터를 추가하는 방법은 무엇입니까?

GPS 메타 데이터를 노드에 직접 추가하려고 시도했지만 GPS IDF 태그를 제거하는 것으로 보입니다. GPS IFD를 TIFFIFD 개체 (TIFFIMageMetadata 개체에서)에 추가하려고 시도했지만 데이터를 제대로 저장하지 못하는 것 같습니다.

기본적으로 GPS 데이터를 올바르게 저장하고 거기에서 데이터를 가져 오는 방법을 알아 내려고 애 쓰고 있습니다. 인터넷에서 검색하는 시간은 자습서 나 도움말의 방식을 거의 얻지 못했고 스택 오버플로에 도움이되는 내용은 없습니다. 그러나 검색 기능이 부족할 수 있습니다.

직접 메타 데이터 노드를 조작하여 그 일을하려고 시도한에서 일부 코드 : 나는 방향에 대해 (현재 하드 코드) 값과 함께,의 GPS 루트 노드에 가입을 시도하고

RenderedImage img = generateImageSomehow(); 
File writeTarget = new File("blah.tiff"); 
//Get the image writer 
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff"); 
ImageTypeSpecifier specifier = new ImageTypeSpecifier(renderedImage); 
ImageWriter writer = writers.next(); 
//Get the metadata 
IIOMetadata metadata = writer.getDefaultImageMetadata(specifier, writers.getDefaultWriteParam()); 
Node root = metadata.getAsTree(FileConstants.TIFF_METADATA_FORMAT); 
Node ifd = root.getFirstChild(); 
//Create a new IFD node for the GPS data, and add some GPS data to it 
IIOMetadataNode gpsRootNode = new IIOMetadataNode("TIFFIFD"); 
gpsRootNode.setAttribute(FileConstants.TIFF_FIELD_NUMBER_ATTRIBUTE, "34853"); 
gpsRootNode.setAttribute(FileConstants.TIFF_FIELD_NAME_ATTRIBUTE, "GPS"); 
gpsRootNode.setAttribute("tagSets", "com.sun.media.imageio.plugins.tiff.EXIFGPSTagSet"); 
IIOMetadataNode childNode = new IIOMetadataNode(FileConstants.TIFF_FIELD_TAG); 
childNode.setAttribute(FileConstants.TIFF_FIELD_NUMBER_ATTRIBUTE, "1"); 
childNode.setAttribute(FileConstants.TIFF_FIELD_NAME_ATTRIBUTE, "GPSLatitudeRef"); 
IIOMetadataNode asciiNode = new IIOMetadataNode("TIFFAsciis"); 
IIOMetadataNode childAsciiNode = new IIOMetadataNode("TIFFAscii"); 
childAsciiNode.setAttribute(FileConstants.TIFF_FIELD_VALUE_ATTRIBUTE, "N"); 
asciiNode.appendChild(childAsciiNode); 
childNode.appendChild(asciiNode); 
gpsRootNode.appendChild(childNode); 
ifd.appendChild(gpsRootNode); 
//Update metadata with new tree 
metadata.setFromTree(FileConstants.TIFF_METADATA_FORMAT, root); 
ImageOutputStream outstr = ImageIO.createImageOutputStream(writeTarget); 
writer.setOutput(outstr); 
//Write the image 
IIOImage img = new IIOImage(renderedImage, Collections.<BufferedImage> emptyList(), metadata); 
writer.write(img); 
outstr.close(); 

. 잘못된 수준, 잘못된 위치, 잘못된 방향 등으로 부착되어 있습니까? TIFF 개체를 사용하는 것이 더 좋을지라도 나는 이렇게 잘하고 있습니다.

코드를 추가하여 이미지를 만드는 방법과 이미지를 저장하는 방법을 보여주기 위해 업데이트되었습니다.


ETA :

여기이 줄 :

ifd.appendChild(gpsRootNode); 

실제로해야합니다

root.appendChild(gpsRootNode); 

이 내가 시도 된 일 이었지만, 나는 IFD 노드를 수행 할 때 GPS 노드를 추가하는 노드로 예외가 발생합니다.

Exception in thread "Thread-2" java.lang.ClassCastException: com.sun.media.imageioimpl.plugins.tiff.TIFFIFD cannot be cast to [J 

IFN 노드를 Long 배열 (표준 JNI 유형에 따라)로 캐스팅하려고하는 것 같습니다. 루트에 첨부하면 제거되는 것처럼 보입니다. 메타 데이터 노드에서 가져옵니다.

+0

'TIFF_METADATA_FORMAT' "com_sun_media_imageio_plugins_tiff_image_1.0"또는 다른 것입니까? – haraldK

+0

그 텍스트입니다 - 나는 그것을 getMetadataFormats() 함수에서 복사했습니다. – aperkins

+0

Hmmm .. 메타 데이터 구조에 몇 가지 문제가있는 것 같습니다.'TIFFIFD' 태그는 DTD에서' "number"'및''name "'이 아닌''parentTagNumber"'와''parentTagName "'속성을 가지도록 정의됩니다. 이름은 모두 중복되어 있으므로 코드에서 피할 것입니다. 또한,'gpsRootNode'는 코드에서와 같이'ifd'의 자식이어야하며 편집 에서처럼'root'가 아니라고 생각합니다. 그것은 두 번째 이미지의 IFD가 아닌 하위 IFD입니다. – haraldK

답변

1

사용자가 조작하는 메타 데이터 트리 표현이 작업 복사본 일 가능성이 가장 높습니다. 나중에 이미지를 작성하고 metadata을 전달하면 트리 표현에 대한 변경 사항이 손실됩니다. 당신이 당신의 GPS 특정 태그와 메타 데이터 트리 (root)을 업데이트 완료 후

, 당신은/metadata.setFromTree(TIFF_METADATA_FORMAT, root) 또는 metadata.mergeTree(TIFF_METADATA_FORMAT, root) 설정을 위해 전화를 다시 metadata 인스턴스에 변경 사항을 병합 중 하나 있습니다. 빈 구조가 아닌 metadata.getAsTree(..)으로 시작하면 setFromTree(..)을 사용하는 것이 좋습니다.

추신 : 문제가되지 않는다면 메타 데이터를 업데이트하고 이미지를 작성하는 코드를 추가하십시오. :-)

+0

그게 문제가 아니에요.이 코드가 끝난 후에 제가하고있는 일입니다. 집에 돌아 가면 오늘 밤에 추가 할 것입니다. (이것은 계약 프로젝트이며, 하루 일의 일부가 아닙니다.) - 그걸 추가하는 것을 잊어 버렸습니다. 원래 게시물. – aperkins

+0

@aperkins Ok. 그렇게. 또는 SSCCE를 작성하는 것이 더 좋습니다. :-) 그 대답을 삭제할 것입니다. – haraldK

+0

질문을 작성 부분 (및 메타 데이터 저장 부분)으로 업데이트했습니다. SSSCCE를 얻을 수는 있지만 문제는 내가 작업하는 데이터가 기밀이므로 실제로 포함 할 수는 없습니다. 기본적으로, 우리는 저장하고있는 이미지 데이터 세트를 가지고 있으며, 메타 데이터에 대한 다른 모든 변경 사항은 잘 저장됩니다. 그러나 GPS IFD를 추가하면 데이터가 삭제됩니다. 여기에는 다른 사용자 지정 노드 (EXIF 사양에 정의 된대로) – aperkins