Чтение метаданных из изображений в WPF - PullRequest
4 голосов
/ 27 марта 2009

Мне известно, что WPF позволяет использовать изображения, для просмотра которых требуются кодеки WIC (например, RAW-файл цифровой камеры); однако я вижу только то, что он позволяет вам показывать изображение в исходном виде, но я никак не могу понять, как получить метаданные (например, время экспозиции).

Очевидно, что это можно сделать, как показывает проводник Windows, но предоставляется ли это через .net API или вы считаете, что это просто вызов собственных интерфейсов COM

Ответы [ 2 ]

9 голосов
/ 27 марта 2009

Проверьте мой Intuipic проект. В частности, класс BitmapOrientationConverter , который считывает метаданные для определения ориентации изображения:

using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    BitmapFrame bitmapFrame = BitmapFrame.Create(fileStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
    BitmapMetadata bitmapMetadata = bitmapFrame.Metadata as BitmapMetadata;

    if ((bitmapMetadata != null) && (bitmapMetadata.ContainsQuery(_orientationQuery)))
    {
        object o = bitmapMetadata.GetQuery(_orientationQuery);

        if (o != null)
        {
            //refer to http://www.impulseadventure.com/photo/exif-orientation.html for details on orientation values
            switch ((ushort) o)
            {
                case 6:
                    return 90D;
                case 3:
                    return 180D;
                case 8:
                    return 270D;
            }
        }
    }
}
2 голосов
/ 04 октября 2016

Несмотря на то, что WPF предоставляет эти API, они не очень дружелюбны и не особенно быстры. Я подозреваю, что они много взаимодействуют.

Я поддерживаю простую библиотеку с открытым исходным кодом для извлечения метаданных из изображений и видео. Это 100% C # без P / Invoke.

// Read all metadata from the image
var directories = ImageMetadataReader.ReadMetadata(stream);

// Find the so-called Exif "SubIFD" (which may be null)
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();

// Read the orientation
var orientation = subIfdDirectory?.GetInt(ExifDirectoryBase.TagOrientation);

switch (orientation)
{
    case 6:
        return 90D;
    case 3:
        return 180D;
    case 8:
        return 270D;
}

В моих тестах это в 17 раз быстрее, чем в WPF API. Если вы хотите использовать только Exif из JPEG, используйте следующее, и оно более чем в 30 раз быстрее:

var directories = JpegMetadataReader.ReadMetadata(stream, new[] { new ExifReader() });

Библиотека извлечения метаданных доступна через NuGet и коды на GitHub .

Благодарность за счет многих участников, которые помогли проекту с момента его начала в 2002 году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...