Как извлечь информацию, такую ​​как дата создания, из файла Canon RAW (.crw) - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь автоматизировать обработку изображений с помощью экстрактора метаданных Дрю Ноатса (https://drewnoakes.com/code/exif/).. Согласно его документации, он может обрабатывать файлы формата RAW от Canon. Однако мне еще не удалось найти способ извлечения информации, такой как дата создания.

Я написал небольшую утилиту для сброса всех каталогов и тегов, возвращаемых библиотекой. Вот соответствующие части этой утилиты:

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. Я использовал для вызова командного файла, в который я написал:
а) извлечь этот эскиз JPEG
б) затем извлеките дату из этого эскиза JPEG

Так что в качестве альтернативного решения я надеялся использовать экстрактор метаданных, чтобы получить этот эскиз JPEG, а затем использовать экстрактор метаданных, чтобы получить дату из этого эскиза JPEG. Однако, как видно из вышеприведенного вывода, пиктограмма JPEG также недоступна для экстрактора метаданных.

Пока я не нашел ни способа, ни документации, ни примера кода, объясняющего, как это сделать.

1 Ответ

0 голосов
/ 13 мая 2019

Как документы ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType (ExifSubIFDDirectory.class);

Дата дата = directory.getDate (ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);

...