Чтение информации IPTC с помощью C #, .NET Framework 2 - PullRequest
4 голосов
/ 25 марта 2009

есть ли возможность прочитать информацию IPTC изображения с C # и .NET Framework 2?

Я не нашел никакого решения. Только с .NET Framework 3.0 или .NET 3.5 вы можете сделать это.

Любая помощь, любая информация?

Большое спасибо из Германии! Stephan

Ответы [ 6 ]

3 голосов
/ 28 апреля 2009

ОК, мой предыдущий ответ был немного смущен. Вот ссылка на проект .NET 2.0 (формат Visual Studio 2008 SLN), который предоставляет некоторые базовые функции извлечения MetaExtractor ZIP (25Kb)

Код SNIP:

// The Parser class extracts the data to hardcoded properties.
// it's 1200 lines - too many to post on StackOverflow
JpegParser parser = new JpegParser(path);
if (parser.ParseDocument())
{
    Console.WriteLine("Parsed {0} {1}", System.IO.Path.GetFileName(path), parser.Title);
    Console.WriteLine("Tags: {0}", parser.KeywordString);
    Console.WriteLine("Description: {0}", parser.Description);
    Console.WriteLine("Title: {0}", parser.Title);
    Console.WriteLine("Rating: {0}", parser.Rating);
}

ИСПОЛЬЗОВАНИЕ:

MetaExtractor "C:\Users\Craig\Pictures\anton-1.jpg"

ВЫВОД:

 == DeepZoomPublisher MetaExtractor v0.1 ==
Parsed anton-1.jpg Beach Photo
Tags: beach, blue sky
Description: Anton
Title: Beach Photo
Rating: 3

Press any key to exit...

Надеюсь, это поможет больше, чем мой предыдущий ответ.

2 голосов
/ 11 апреля 2011

Я понимаю, что этот ответ не касается .NET Framework v2, но я подумал, что стоит документировать это для тех из вас, кто использует .NET 3.5 или выше. Это может также работать в 3.0, но я там не проверял.

Следующий вызов функции вернет ключевые слова, встроенные в изображение JPEG:

    private string[] GetKeywords(string filespec)
    {
        BitmapDecoder decoder = new JpegBitmapDecoder(new FileStream(filespec, FileMode.Open), BitmapCreateOptions.None, BitmapCacheOption.None);
        BitmapMetadata meta = (BitmapMetadata)decoder.Frames[0].Metadata;
        return meta.Keywords.ToArray<string>();
    }

BitmapDecoder и класс BitmapMetadata содержатся в сборке, которая обычно используется в WPF, поэтому для использования этих классов вам нужно будет сослаться на следующие сборки:

  • PresentationCore
  • WindowsBase

Я успешно использую этот подход в приложении WinForm, но подозреваю, что он может быть адаптирован для других типов приложений. Кроме того, вы можете видеть, что абстрактному классу «BitmapDecoder» в этом примере назначен экземпляр JpegBitmapDecoder, но вы можете получить экземпляр другого декодера для вашего типа изображения (также поддерживаются TIFF, GIF, PNG, BMP и WMP).

1 голос
/ 06 мая 2011

Я только что обыскал почти весь Интернет, чтобы найти решение C # для извлечения информации IPTC, и нашел этот замечательный и совершенно новый учебник в Code Project:

http://www.codeproject.com/KB/graphics/ReadingIPTCAPP14.aspx

Надеюсь, это кому-нибудь поможет. :)

1 голос
/ 30 марта 2009

Stephan,

Эти две ссылки должны быть полезны

Чтение метаданных XMP из JPEG

EXIF ​​экстрактор (в CodeProject)

Они оба получают доступ к немного различным частям заголовка JPEG, чтобы извлечь различные метаданные, которые могут быть встроены. Я использовал их код в Searcharoo (который вы можете загрузить) и для извлечения широты / долготы из JPEG для этого DeepZoom примера .

Вы можете получить мой JpegParser.cs класс из этого 13kb кода ZIP - он захватывает только несколько свойств (Название / Описание / Ключевые слова / Рейтинг / Широта-Долгота), но вы должны видеть в коде, где извлечь больше == СМОТРИТЕ РЕДАКТИРОВАТЬ НИЖЕ ==

ПРИМЕЧАНИЕ: тяжелая работа была проделана авторами двух статей, указанных выше.

РЕДАКТИРОВАТЬ: комментарий ниже выделите лицо, на которое JpegParser.cs я ссылался выше, включает ссылку на using System.Windows.Media.Imaging; и BitmapImage img = new BitmapImage(new Uri(filename));. Они были добавлены как часть (незавершенного) улучшения, поэтому их можно безопасно удалить, а класс JpegParser.cs должен работать в версии 2.0 (хотя содержащийся проект не будет - извините за путаницу).

Кроме того, вы можете получить аналогичный код (потребуется некоторое редактирование) из JpegDocument.cs класса в Searcharoo - приложения .NET 2.0, которое индексирует файлы (включая JPEG) для пример этого результат поиска

0 голосов
/ 28 апреля 2009

Попробовав несколько предложений здесь и в других местах, но безуспешно, я решил написать класс для вызова инструмента командной строки exiv2. В моем сценарии допустимо небольшое снижение производительности за порождение процесса для каждого изображения, а в других - нет.

  • Вызов exiv2.exe с использованием System.Process
  • Передать аргументы "-pi filename.jpg" для вывода всех полей IPTC
  • Чтение вывода с использованием System.Process.StandardOutput.ReadToEnd ();
  • Выход можно разбить на части, используя Regex
0 голосов
/ 25 марта 2009

Если это было реализовано в 3.x, его не было в более ранних версиях.

Однако, есть сторонние библиотеки, которые могут сделать свое дело. ImageMagick является одним из них. Если вы ищете более простую (и бесплатную) реализацию, эта статья или поиск в Google могут привести вас к решению.

Удачи.

...