Я пытаюсь автоматизировать обработку изображений с помощью экстрактора метаданных Дрю Ноатса (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 также недоступна для экстрактора метаданных.
Пока я не нашел ни способа, ни документации, ни примера кода, объясняющего, как это сделать.