【问题标题】:Write EXIF data to TIFF file using Apache Commons Imaging使用 Apache Commons Imaging 将 EXIF 数据写入 TIFF 文件
【发布时间】:2016-10-25 13:16:06
【问题描述】:

如何使用 Apache Commons Imaging 将 EXIF 数据写入 TIFF 图像?

这是我尝试过的:

File img = new File("pic.tif");
File dst = new File("out.tif");
try (FileOutputStream fos = new FileOutputStream(dst);
     OutputStream os = new BufferedOutputStream(fos)) {

    TiffOutputSet outputSet = null;

    final ImageMetadata metadata = Imaging.getMetadata(img);
    final TiffImageMetadata tiffMetadata = (TiffImageMetadata) metadata;
    outputSet = tiffMetadata.getOutputSet();

    if (null == outputSet) {
        outputSet = new TiffOutputSet();
    }

    // New York City
    final double longitude = -74.0;
    final double latitude = 40 + 43 / 60.0;
    outputSet.setGPSInDegrees(longitude, latitude);

    new ExifRewriter().updateExifMetadataLossless(img, os, outputSet);
}

但我收到了这个错误:

Exception in thread "main" org.apache.commons.imaging.ImageReadException: Not a Valid JPEG File: doesn't begin with 0xffd8
    at org.apache.commons.imaging.common.BinaryFunctions.readAndVerifyBytes(BinaryFunctions.java:134)
    at org.apache.commons.imaging.formats.jpeg.JpegUtils.traverseJFIF(JpegUtils.java:56)
    at org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter.analyzeJFIF(ExifRewriter.java:186)
    at org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter.updateExifMetadataLossless(ExifRewriter.java:376)
    at org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter.updateExifMetadataLossless(ExifRewriter.java:298)
    at Test.main(Test.java:94)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

这似乎表明ExifRewriter 类不支持 TIFF?但是那我应该使用哪个类呢?

【问题讨论】:

  • 赞成这个问题,因为我有同样的问题。

标签: java image-processing metadata exif apache-commons-imaging


【解决方案1】:

ExifRewriter 是org.apache.commons.imaging.formats.jpeg 包的工具,因此它不适用于TIFF 格式。

为了将 EXIF 和标签写入 TIFF 文件,您必须读取它,然后使用为您的 OutputSet 创建的标签重新写入它:

BufferedImage img = Imaging.getBufferedImage(f);
byte[] imageBytes = Imaging.writeImageToBytes(img, ImageFormats.TIFF, new HashMap<>());

File ex = new File(FileUtils.getBaseFileName(f) + "_exif." + FileUtils.getExtension(f));
try(FileOutputStream fos = new FileOutputStream(ex);
    OutputStream os = new BufferedOutputStream(fos)) {
    new TiffImageWriterLossless(imageBytes).write(os, outputSet);
}

然后您可能想用 exif 文件覆盖原始文件:

Files.delete(Paths.get(f.toURI()));
Files.move(Paths.get(ex.toURI()), Paths.get(f.toURI()));

【讨论】:

    【解决方案2】:

    这也可能有帮助

                BufferedImage bufferedImage = Imaging.getBufferedImage(out.toByteArray()); 
                File imageFile = new File(outputFileName);
                final Map<String, Object> optionalParams = new HashMap<String, Object>();
    
                TiffOutputSet tiffExif = new TiffOutputSet();
                tiffExif.addRootDirectory().add(MicrosoftTagConstants.EXIF_TAG_XPTITLE, "Title");
                optionalParams.put("EXIF", tiffExif);
                Imaging.writeImage(bufferedImage, imageFile, ImageFormats.TIFF, optionalParams);
    

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多