如何从佳能RAW文件(.crw)中提取创建日期等信息



我正在尝试使用Drew Noates的元数据提取器(https://drewnoakes.com/code/exif/)自动处理图像。根据他的文档,它可以处理佳能的RAW文件格式。但是,我还没有找到一种方法来提取创建日期等信息。

我写了一个小工具来转储库返回的所有目录和标签。以下是该实用程序的相关部分:

private static PrintStream OUT = System.out;
private static void processFile(final File f)
{
final String lcName = f.getName().toLowerCase();
try
{
final Metadata metadata = ImageMetadataReader.readMetadata(f);
dumpDirectories(metadata);
}
catch (final ImageProcessingException e)
{
System.err.println("Error while processing "" + f.getAbsolutePath() + "" : " +
e.getMessage());
}
catch (final IOException e)
{
System.err.print("Error while processing "" + f.getAbsolutePath() + "" : ");
e.printStackTrace();
}
}
private static void dumpDirectories(final Metadata metadata)
{
for (final Directory directory : metadata.getDirectories())
{
OUT.print('t');
OUT.println(directory.getClass().getName());
for (final Tag tag : directory.getTags())
{
final Object value = directory.getObject(tag.getTagType());
OUT.print("tt");
OUT.print(tag.getTagName());
OUT.print(" = ");
if (value != null && value.getClass().isArray())
{
if (value instanceof byte[])
{
OUT.println(Arrays.toString((byte[])value));
}
else if (value instanceof float[])
{
OUT.println(Arrays.toString((float[])value));
}
else if (value instanceof int[])
{
OUT.println(Arrays.toString((int[])value));
}
else if (value instanceof short[])
{
OUT.println(Arrays.toString((short[])value));
}
else
{
OUT.println(Arrays.deepToString((Object[]) value));
}
}
else
{
OUT.println(value);
}
}
}
}

如果我对我的 .crw 文件运行上面的代码,我会得到以下输出:

com.drew.metadata.file.FileTypeDirectory
Detected File Type Name = CRW
Detected File Type Long Name = Canon Camera Raw
Expected File Name Extension = crw
com.drew.metadata.file.FileSystemDirectory
File Name = blah.crw
File Size = 3040264
File Modified Date = Sat Jun 28 15:28:51 EDT 2003

但是,我在任何地方都看不到照片的实际拍摄日期("文件修改日期"来自文件系统,因此它可能与照片拍摄日期匹配,也可能不匹配)。我相信CRW中嵌入了一个小缩略图JPEG,其中包含所有正确的EXIF信息。我曾经调用我写到的批处理文件:
a)提取该缩略图JPEG
b)然后从该缩略图JPEG中提取日期

因此,作为替代解决方案,我希望使用元数据提取器来获取该缩略图 JPEG,然后使用元数据提取器从该缩略图 JPEG 中获取日期。但是,从上面的输出中可以看出,元数据提取器也无法访问缩略图 JPEG。

到目前为止,我还没有找到解释如何执行此操作的方法或文档或代码示例。

喜欢文档 ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);

日期日期 = 目录.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);

最新更新