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 유형에 따라)로 캐스팅하려고하는 것 같습니다. 루트에 첨부하면 제거되는 것처럼 보입니다. 메타 데이터 노드에서 가져옵니다.
'TIFF_METADATA_FORMAT' "com_sun_media_imageio_plugins_tiff_image_1.0"또는 다른 것입니까? – haraldK
그 텍스트입니다 - 나는 그것을 getMetadataFormats() 함수에서 복사했습니다. – aperkins
Hmmm .. 메타 데이터 구조에 몇 가지 문제가있는 것 같습니다.'TIFFIFD' 태그는 DTD에서' "number"'및''name "'이 아닌''parentTagNumber"'와''parentTagName "'속성을 가지도록 정의됩니다. 이름은 모두 중복되어 있으므로 코드에서 피할 것입니다. 또한,'gpsRootNode'는 코드에서와 같이'ifd'의 자식이어야하며 편집 에서처럼'root'가 아니라고 생각합니다. 그것은 두 번째 이미지의 IFD가 아닌 하위 IFD입니다. – haraldK