0

我正在尝试使用 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("\t\t");
            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。

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

4

1 回答 1

0

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

日期日期 = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);

于 2019-05-13T14:37:31.493 回答