使用Java编辑jpeg EXIF数据

我想编辑jpg文件的属性,如:评论,标题,拍摄日期,相机制造商等。

在此处输入图像描述

我找到了库来读取这些数据。 但是我需要一个带有示例的免费库来编辑它们。

我知道apache的成像(sanselan)。 但我无法使用它编辑数据。 如果您以前使用过它,我会接受这个答案,只有当您提供的示例代码不是他们网站上的代码时。 因为即使我使用他们的例子我也无法编辑GPS数据以外的任何属性。 运行代码后,file-properties-details仍然具有相同的值。

谢谢 !

注意:我也尝试过JHeader( https://sourceforge.net/projects/jheader/ ),但是使用它作为带有-cl选项的进程仍然没有更改属性列表。

Apache commons Imaging适合我。

我扩展了这里提供的样本

显然我的客户端代码看起来像这样

public static void main(String[] args) throws ImageWriteException, ImageReadException, IOException { new WriteExifMetadataExample().changeExifMetadata(new File("somefilename.jpg"), new File("result_file.jpg")); } 

和WriteExifMetadataExample中的扩展方法

 public void changeExifMetadata(final File jpegImageFile, final File dst) throws IOException, ImageReadException, ImageWriteException { OutputStream os = null; boolean canThrow = false; try { TiffOutputSet outputSet = null; // note that metadata might be null if no metadata is found. final ImageMetadata metadata = Imaging.getMetadata(jpegImageFile); final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; if (null != jpegMetadata) { // note that exif might be null if no Exif metadata is found. final TiffImageMetadata exif = jpegMetadata.getExif(); if (null != exif) { // TiffImageMetadata class is immutable (read-only). // TiffOutputSet class represents the Exif data to write. // // Usually, we want to update existing Exif metadata by // changing // the values of a few fields, or adding a field. // In these cases, it is easiest to use getOutputSet() to // start with a "copy" of the fields read from the image. outputSet = exif.getOutputSet(); } } // if file does not contain any exif metadata, we create an empty // set of exif metadata. Otherwise, we keep all of the other // existing tags. if (null == outputSet) { outputSet = new TiffOutputSet(); } { // Example of how to add a field/tag to the output set. // // Note that you should first remove the field/tag if it already // exists in this directory, or you may end up with duplicate // tags. See above. // // Certain fields/tags are expected in certain Exif directories; // Others can occur in more than one directory (and often have a // different meaning in different directories). // // TagInfo constants often contain a description of what // directories are associated with a given tag. // final TiffOutputDirectory exifDirectory = outputSet .getOrCreateExifDirectory(); // make sure to remove old value if present (this method will // not fail if the tag does not exist). exifDirectory .removeField(ExifTagConstants.EXIF_TAG_APERTURE_VALUE); exifDirectory.add(ExifTagConstants.EXIF_TAG_APERTURE_VALUE, new RationalNumber(3, 10)); } { // Example of how to add/update GPS info to output set. // New York City final double longitude = -74.0; // 74 degrees W (in Degrees East) final double latitude = 40 + 43 / 60.0; // 40 degrees N (in Degrees // North) outputSet.setGPSInDegrees(longitude, latitude); } final TiffOutputDirectory exifDirectory = outputSet .getOrCreateRootDirectory(); exifDirectory .removeField(ExifTagConstants.EXIF_TAG_SOFTWARE); exifDirectory.add(ExifTagConstants.EXIF_TAG_SOFTWARE, "SomeKind"); os = new FileOutputStream(dst); os = new BufferedOutputStream(os); new ExifRewriter().updateExifMetadataLossless(jpegImageFile, os, outputSet); canThrow = true; } finally { IoUtils.closeQuietly(canThrow, os); } } 

请注意我添加额外标签的行

 final TiffOutputDirectory exifDirectory = outputSet .getOrCreateRootDirectory(); exifDirectory .removeField(ExifTagConstants.EXIF_TAG_SOFTWARE); exifDirectory.add(ExifTagConstants.EXIF_TAG_SOFTWARE, "SomeKind"); 

结果正确添加了EXIF标签

在此处输入图像描述


要更改注释标记,您可以执行以下操作

  final TiffOutputDirectory exifDirectory = outputSet.getOrCreateRootDirectory(); exifDirectory.removeField(MicrosoftTagConstants.EXIF_TAG_XPCOMMENT); exifDirectory.add(MicrosoftTagConstants.EXIF_TAG_XPCOMMENT, "SomeKind"); 

可用常量的完整列表在包中:

 org.apache.commons.imaging.formats.tiff.constants 

在此处输入图像描述

这样的例子会对你有用吗?

我假设使用像org.apache.commons.imaging.util.IoUtils这样的包并导入org.apache.commons.imaging.Imaging对你有很大的帮助。

要更改注释标记,您可以执行以下操作

  final TiffOutputDirectory exifDirectory = outputSet.getOrCreateRootDirectory(); exifDirectory.removeField(MicrosoftTagConstants.EXIF_TAG_XPCOMMENT); exifDirectory.add(MicrosoftTagConstants.EXIF_TAG_XPCOMMENT, "SomeKind"); 

可用常量的完整列表在包中:

 org.apache.commons.imaging.formats.tiff.constants 

在此处输入图像描述