【发布时间】:2016-10-17 19:18:50
【问题描述】:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import org.apache.sanselan.*;
import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.IImageMetadata;
import org.apache.sanselan.common.ImageMetadata;
import org.apache.sanselan.common.RationalNumber;
import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter;
import org.apache.sanselan.formats.tiff.TiffImageMetadata;
import org.apache.sanselan.formats.tiff.constants.ExifTagConstants;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
import org.apache.sanselan.formats.tiff.constants.TiffFieldTypeConstants;
import org.apache.sanselan.formats.tiff.constants.TiffTagConstants;
import org.apache.sanselan.formats.tiff.write.TiffOutputDirectory;
import org.apache.sanselan.formats.tiff.write.TiffOutputField;
import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;
import org.apache.sanselan.formats.tiff.fieldtypes.FieldTypeASCII;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class extraction {
public static void main(String[] args) throws ImageReadException, ImageWriteException, IOException {
extraction obj = new extraction();
File jpeg = new File("/Users/prijunankar/Desktop/G0015444.jpg");
File jpeg2 = new File("/Users/prijunankar/Desktop/G0015444a.jpg");
obj.editAnnotation(jpeg, jpeg2, "2016:07:04 00:00:00");
}
public void editAnnotation(final File jpeg, final File dest, final String tag) throws ImageReadException, IOException, ImageWriteException {
OutputStream os = null;
TiffOutputSet outputSet = null;
final IImageMetadata md = Sanselan.getMetadata(jpeg);
final JpegImageMetadata jpegmd = (JpegImageMetadata) md;
TiffOutputDirectory exifDir = null;
if(null != jpegmd) {
final TiffImageMetadata exif = jpegmd.getExif();
if (null != exif) {
outputSet = exif.getOutputSet();
exifDir = outputSet.getExifDirectory();
//System.out.println(exifDir.getFields().toString());
System.out.println("exif exists");
}
}
else if (null == outputSet) {
outputSet = new TiffOutputSet();
System.out.println("no exif");
exifDir = outputSet.getOrCreateExifDirectory();
}
//final FieldType field = new FieldType(TiffFieldTypeConstants.FIELD_TYPE_ASCII, 1, "Test");
Date newDate = new Date();
newDate.setDate(1);
newDate.setMonth(2);
newDate.setYear(2016);
String date = newDate.toString();
byte[] b = date.getBytes();
final TiffOutputField output = new TiffOutputField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, FieldType.FIELD_TYPE_BYTE, b.length, b);
//final TiffOutputField output2 = TiffOutputField.
//final TiffOutputDirectory exifDir = outputSet.getExifDirectory();
//System.out.println(exifDir.toString());
//System.out.println(exifDir.getRawTiffImageData().toString());
exifDir.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
exifDir.add(output);
double longitude = -74.0; // 74 degrees W (in Degrees East)
double latitude = 40 + 43 / 60.0; // 40 degrees N (in Degrees
// North)
outputSet.setGPSInDegrees(longitude, latitude);
os = new FileOutputStream(dest);
os = new BufferedOutputStream(os);
new ExifRewriter().updateExifMetadataLossless(jpeg, os, outputSet);
os.close();
os = null;
}
}
这是我用来尝试更新 Original_Date_Time 标记的代码。但是,在运行此代码后检查新的 exif 数据时,它会输出:
file: \Users\prijunankar\Desktop\G0015444a.jpg
XResolution: 72
Date Time: '2016:07:03 17:46:24'
Date Time Original: 87, 101, 100, 32, 77, 97, 114, 32, 48, 49, 32, 49, 52, 58, 50, 53, 58, 48, 52, 32, 69, 83, 84, 32, 51, 57, 49, 54
ISO: 100
Shutter Speed Value: -11468/-1000 (11.468)
Aperture Value: 280/100 (2.8)
Brightness Value: Not Found.
日期时间原始标签不保存为字符串(以前是相同格式的日期时间),而是保存为字节数组。有人可以帮忙解释为什么/出了什么问题吗?
【问题讨论】:
-
您使用的是
FIELD_TYPE_BYTE,但应使用FIELD_TYPE_ASCII来表示日期。此外,您正在编写与 TIFF 日期中使用的格式不匹配的Date.toString()(即“Wed Mar 01 14:25:04 EST 3916”)的输出。tag参数的值可以,但是好像没有用。
标签: java apache metadata tiff imaging