2013-03-24 2 views
3

저는 Windows Live 사진 갤러리의 작동 방식과 비슷한 방법으로 내 이미지에 태그를 쓰는 방법을 연구했습니다. 여러 다른 라이브러리 (메타 데이터 추출기, jhead, jheader, sanselan)를 사용했지만 실제로 필요한 데이터를 다시 작성하기 위해 Sanselan 만 찾았습니다.Sanselan으로 EXIF ​​XPKEYWORDS 쓰기

나는 아파치의 WriteExifMetadataExample에서 T &까지 따라 갔다. 그것은 GPS 데이터와 Aperture를 업데이트하는데 완벽하게 작동했다.

그런 다음 EXIF_TAG_APERTURE_VALUE이 아닌 EXIF_TAG_XPKEYWORDS을 업데이트하기 위해 예제를 수정하려고했습니다.

가 aperature와 GPS 업데이트 코드를 주석에 비해
String currentTagsAsString = new String((byte[]) jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_XPKEYWORDS).getValue()); 
System.out.println("current tags: '" + currentTagsAsString + "'"); 
String newTag = "h e l l o"; 
String newTagsAsString = currentTagsAsString.trim() + " ; " + newTag + " "; 
System.out.println("new desired tags: '" + newTagsAsString + "'"); 
TiffOutputField keywords = new TiffOutputField(ExifTagConstants.EXIF_TAG_XPKEYWORDS, FieldType.FIELD_TYPE_BYTE, newTagsAsString.length(), newTagsAsString.getBytes()); 
exifDirectory.removeField(ExifTagConstants.EXIF_TAG_XPKEYWORDS); 
exifDirectory.add(keywords); 

기타, 나머지는 내가 혼자 : 위의 링크 된 예에서

, 나는 다음과 TiffOutputField.create 라인을 교체했다. 나는 바이트 배열의 형식이 나 혼란 스럽다는 것을 인정할 것이다. 그래서 문제가 될 것이다.

경고/오류/기타가 표시되지 않습니다. 프로세스가 정상적으로 완료되었지만 새 이미지 파일에 업데이트 된 태그가 없습니다. 새 이미지에 업데이트 된 태그가없는 이유는 무엇입니까? 더 쉽고/좋은 방법이 있습니까?

업데이트 : 대신 1.0 RC 공유 이미징 API로 작업하도록 코드를 편집했지만 결과는 같습니다. 나는 완벽

TiffImageMetadata metadata = toTiffMetadata(Imaging.getMetadata(inputFile)); 
System.out.println(metadata.getFieldValue(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS)); 
TiffOutputSet outputSet = metadata.getOutputSet(); 
TiffOutputDirectory exif = outputSet.getOrCreateExifDirectory(); 
exif.removeField(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS); 
exif.add(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;"); 
writeFileWithNewTag(inputFile,destinationFile,outputSet); 

새로운 코드는 내가 EXIF_TAG_XPAUTHOR 같은 것을 사용하는 경우 잘 작동하지만, EXIF_TAG_XPKEYWORDS를 사용하여 오류 또는 경고 또는 어떤 종류의 메시지와 새 파일이 단순히 doens을 생산하지 여기에 사용되는 코드를 포함하고있다 새 태그 데이터가 포함되어 있지 않습니다.

+0

을 발견 한 코드 아래에 시도를 제공 할 수 있습니다. 원래 바이트 배열의 실제 인코딩에는 공백 문자가 포함되지 않고 대신 '0'바이트가 포함됩니다. 난 운이 없으면 코드를 적절하게 조정했다. – Randyaa

+0

이것을 할 방법을 찾았습니까? 즉, XPKEYWORDS를 새로 작성/업데이트/덮어 쓰시겠습니까? 그렇지 않다면 하나를 발견했을 수 있습니다. 하지만 내 게시 방법보다는 내 접근 방식을 비교하고 싶습니다. 다른 점을보기 만하면됩니다. 어쨌든 나는 그것을 여기에 곧 게시 할 것이다. – 2dvisio

답변

0

더 이상 권장되지 않는 새로운 태그 작성 방법입니다. Microsoft XP 태그는 바이트 유형이라고 주장하기 때문에 특정 문제이지만 데이터는 실제로 UTF-16LE입니다. 당신이하지 않는 것을 어떻게 알

private static void rewriteXpKeywords(String fileIn, String fileOut) throws Exception { 
    TiffImageMetadata exif; 
    IImageMetadata meta = Imaging.getMetadata(new File(fileIn)); 
    if (meta instanceof JpegImageMetadata) { 
     exif = ((JpegImageMetadata)meta).getExif(); 
    } else if (meta instanceof TiffImageMetadata) { 
     exif = (TiffImageMetadata)meta; 
    } else { 
     return; 
    } 
    TiffOutputSet outputSet = exif.getOutputSet(); 
    TiffOutputDirectory exifDir = outputSet.findDirectory(TiffDirectoryConstants.DIRECTORY_TYPE_EXIF); 
    exifDir.removeField(AllTagConstants.EXIF_TAG_XPKEYWORDS); 
    exifDir.add(AllTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;"); 

    ExifRewriter rewriter = new ExifRewriter(); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(new File(fileOut)); 
     rewriter.updateExifMetadataLossy(new File(fileIn), fos, outputSet); 
    } finally { 
     if (fos != null) { 
      fos.close(); 
     } 
    } 
} 

: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/jpeg/exif/MicrosoftTagTest.java?view=markup

+0

새로운 API를 매우 좋아하지만 업데이트 된 코드와 똑같은 문제가 있습니다.필자는 작성자를 업데이트 할 수 있지만 xpkeywords에 대한 업데이트는 오류를 발생시키지 않지만 데이터를 수정하지는 않습니다. 새로운 트렁크 커먼즈 이미징 구문을 사용하도록 질문을 업데이트하겠습니다. – Randyaa

4

내가 성공적으로 XP가이 코드에 태그를 키워드를 추가 - 예를 들어,

오히려 모든이를 돌봐 새로운 API를 사용 "데이터 수정"? 너 그거 뭘 검사 해?

+0

오늘 밤에이 사진을 찍을 것이지만 많이 달라 보이지는 않습니다. 나는 동일한 자바 코드를 사용하여 새로 생성 된 파일을 읽음으로써 (원래의 키워드를 처음부터 인쇄한다) 키워드를 원래의 파일과 동일하게 유지할 것인지 검사한다. – Randyaa

+0

방금 ​​알아챈 한 가지 차이점은 내 코드처럼 'outputSet.getOrCreateExifDirectory'가 아니라 'outputSet.findDirectory'를 수행하고 있다는 것입니다. 나는 어제 밤에 그 디렉토리를 저장하려고 시도하는 디렉토리가 틀릴 수도 있다고 생각했다. 아마 그게 문제 일 것이다. – Randyaa

+0

nope no luck. 던져진 println을 사용하여 코드를 사용하고 있습니다. System.out.println (exif.getFieldValue (MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS)); – Randyaa

1

나는 동일한 문제가있어 해결책을 얻었습니다. 당신은 내가 내 문자열 서식을 조금을했다

public static TiffOutputField getTiffOutputFieldKeyword(
TiffOutputSet outputSet, String metaDataToChange) { 
TiffOutputField imageHistoryPre = outputSet 
    .findField(TiffConstants.EXIF_TAG_XPKEYWORDS); 
if (imageHistoryPre != null) { 
outputSet.removeField(TiffConstants.EXIF_TAG_XPKEYWORDS); 
} 

TiffOutputField tiffOutputField = new TiffOutputField(
    TiffConstants.EXIF_TAG_XPKEYWORDS, 
    TiffFieldTypeConstants.FIELD_TYPE_BYTE, 
    metaDataToChange.getBytes("UTF-16").length, metaDataToChange.getBytes("UTF-16")); 

return tiffOutputField; 
} 

Writing XPKeywords in Exif