dragon66 / icafe

Java library for reading, writing, converting and manipulating images and metadata
Eclipse Public License 1.0
203 stars 58 forks source link

Tiff图片insertExif总是throw Runtime Exception: Duplicate Tag #94

Closed WuyiSun closed 3 years ago

WuyiSun commented 3 years ago

Hi 你好, 我试图用Metadata.insertExif(fin, fout, updatedExif, true)的方式来更新一张tiff图片的某些exif tags。但是对于要更新的field,比如"Copyright" 或者 "Software", 在我用Metadata.insertExif(fin, fout, updatedExif, true) 的时候总是在报错 (Runtime Exception: Duplicate Tag)。 但是同样的代码对于jpg更新exif就没有问题。 想请教一下为什么? 附上代码片段:

    private void updateExifFields(MetadataEntry entry, Exif updatedExif) {
        if (!StringUtils.isNullOrEmpty(entry.getValue())) {
            if (entry.getKey().equals("Software")) {
                Optional<ExifTag> currentExifTag = findTagFromTagName(entry.getKey(), ExifTag.values());
                Optional<TiffTag> currentTiffTag = findTagFromTagName(entry.getKey(), TiffTag.values());
                if (currentExifTag.isPresent()) {
                    updatedExif.addExifField(currentExifTag.get(), FieldType.ASCII, "wuyi-test2");
                }
                if (currentTiffTag.isPresent()) {
                    updatedExif.addImageField(currentTiffTag.get(), FieldType.ASCII, "wuyi-test2");
                }
            }

        }
        if(entry.isMetadataEntryGroup()) {            
            Collection<MetadataEntry> entries = entry.getMetadataEntries();
            for(MetadataEntry e : entries) {
                updateExifFields(e, updatedExif);
            }
        }
    }

使用的图片是您的测试文件exif.tiff (https://github.com/dragon66/icafe/blob/master/images/exif.tif)

谢谢! Wuyi

dragon66 commented 3 years ago

Tiff本身对Exif来说是Image IFD,而JPEG的Exif是独立的。你插入的是一个Tiff tag,它属于Image IFD。对于Tiff,为了不破坏图像的完整性,除了极个别的tag,是不允许更新的。比如你如果不小心改动了图像的尺寸等等属性,图像解码就可能出现错误。基于以上原因,如果用Metadata.insertExif(fin, fout, updatedExif, true)的方式来更新已经存在的tag就会报错。JPEG和Tiff不同,它的Exif本身是和图像解码无关的。所以不会受到以上限制。

你可以修改TiffTag里的SoftWare tag,让它的iscritical方法返回false,然后你就可以修改这个tag的值了。