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

4e3c752ec070fbba1d3834515144d037.png

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

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

谢谢 !

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

解决方法:

Apache commons Imaging适合我.

我已经扩展了here提供的样本

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

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标签

578e013a9af9ebb0e02b625c8beab2a5.png

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

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

db329beb8e76f0890ca5121c766f5807.png

标签:java,image,jpeg,exif

来源: https://codeday.me/bug/20191001/1838091.html

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐