Как получить доступ к полю exif-данных из плагина фильтра Photoshop (Photoshop SDK) - PullRequest
1 голос
/ 24 февраля 2012

Я ищу очень конкретную информацию.Я мог бы сделать это довольно подробным вопросом, я думаю, но я бы предпочел сделать его кратким и конкретным.Мне нужно получить доступ к части метаданных (exif-информации) из плагина фильтра Photoshop.Я никогда не имел дело с данными exif из плагина Photoshop или без него, и документация PS SDK имеет форму, которая оставляет много вопросов.В конце концов я бы туда попал, но мне было интересно, если бы кто-нибудь здесь делал это раньше и мог бы помочь мне с примером.Я был бы очень благодарен за это ...

То, что нам нужно, должно быть задокументировано здесь, в SDK:

documentation/html/group___resource_suite.html
documentation/html/imageresourcessection.html 

В последнем документе говорится, что идентификатор ресурса, который мне нужен для полученияexif data - 1059 (десятичное число), и этот доступ к данным Exif поддерживается начиная с PS 7.0, что хорошо.Но в SDK нет информации (которую я нашел) относительно того, что вы получаете, указатель?указатель на что?Они просто говорят вам посмотреть на спецификации EXIF.Так я получаю указатель на двоичные данные EXIF ​​RAW и, если да, как мне извлечь поле из этого.

Спецификации для данных Exif здесь: http://exif.org/specifications.html

КакПример, который я хотел бы получить в этом поле exif:

Tag Name                            Field Name          Dec     Hex     Type  Count
Image title                         ImageDescription    270     10E     ASCII Any

Ответы [ 3 ]

0 голосов
/ 05 марта 2012

РЕДАКТИРОВАТЬ : После более глубокого исследования я обнаружил следующее (выдержка из документации):

Документ: Руководство по Photoshop API.Аргумент: Обратные вызовы.

Процедуры обратного вызова организованы в наборы «наборов» связанных подпрограмм, которые реализуют определенную функциональность.

Наборы описываются указателем назапись, содержащая:

  1. 2-байтовый номер версии для набора,
  2. 2-байтовый счетчик количества подпрограмм в наборе,
  3. серия функцийуказатели для подпрограмм обратного вызова.

Вас интересует Property suite .

Текущая версия: 1;Adobe Photoshop: 5,0;Подпрограммы: 2.

Свойства идентифицируются подписью и ключом, которые образуют пару для идентификации интересующего свойства.

Подпись Adobe Photoshop всегда '8BIM' (0x3842494D).

Свойство EXIF ​​контролируется Японской ассоциацией развития электронной промышленности (JEIDA) и Японской ассоциацией электронной промышленности (EIAJ), которые объединились в Novemeber 2000 года. Спецификацию EXIF ​​можно загрузить с их веб-сайта.сайт в следующем месте.

http://it.jeita.or.jp/jhistory/document/standard/exif_eng/jeida49eng.htm

GetPropertyProc( )

MACPASCAL OSErr (*GetPropertyProc) (OSType signature, OSType key, int32 index, int32 * simpleProperty, Handle * complexProperty);

Эта подпрограмма позволяет получить информацию о документе, который обрабатывается в настоящее время.

property name: propEXIFData 
id:EXIF 
type:complex (modifiable)
description:Camera and device data.

Напомним, Iнапишу какой-нибудь сочный код:

GetPropertyProc getProperty = formatParamBlock->propertyProcs->getPropertyProc;
rc = getProperty(0x3842494D, propEXIFData, 0, &simpProp, &compProp);
if ( rc )   
    return;

GetPIHandleSizeProc getSize = formatParamBlock->handleProcs->getSizeProc;
int32 size = getSize(compProp);
if ( !size ) 
   return;

LockPIHandleProc lock = formatParamBlock->handleProcs->lockProc;
uint8* exif = (uint8 *)lock(compProp, false);
if ( !exif ) 
   return;
0 голосов
/ 23 февраля 2015

Я комбинированный ответ Вулканино и ThdK .Мой метод использует функцию PIGetEXIFData, объявленную в файле PropertyUtils.h, которая возвращает двоичный exif.Далее этот exif декодируется Exiv2 библиотека

#include <PropertyUtils.h>
#include <PIProperties.h>

#include <exif.hpp>

void printExif() {
    Handle handle;
    checkSPErr(PIGetEXIFData(handle));
    std::string ss;
    checkSPErr(HandleToString(handle, ss));

    Exiv2::ExifData exifData;
    Exiv2::ExifParser::decode(exifData, reinterpret_cast<const Exiv2::byte*>(ss.data()), ss.size());
    Exiv2::ExifData::const_iterator end = exifData.end();
    for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
        const char* tn = i->typeName();
        std::cout << std::setw(44) << std::setfill(' ') << std::left
            << i->key() << " "
            << "0x" << std::setw(4) << std::setfill('0') << std::right
            << std::hex << i->tag() << " "
            << std::setw(9) << std::setfill(' ') << std::left
            << (tn ? tn : "Unknown") << " "
            << std::dec << std::setw(3)
            << std::setfill(' ') << std::right
            << i->count() << "  "
            << std::dec << i->value()
            << "\n";
    }
}
0 голосов
/ 05 марта 2012

Вот пример кода с использованием библиотеки Exiv2 : http://www.exiv2.org/doc/exifprint_8cpp-example.html

// ***************************************************************** -*- C++ -*-
// exifprint.cpp, $Rev: 2286 $
// Sample program to print the Exif metadata of an image

#include <exiv2/exiv2.hpp>

#include <iostream>
#include <iomanip>
#include <cassert>

int main(int argc, char* const argv[])

try {

if (argc != 2) {
    std::cout << "Usage: " << argv[0] << " file\n";
    return 1;
}

Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[1]);
assert(image.get() != 0);
image->readMetadata();

Exiv2::ExifData &exifData = image->exifData();
if (exifData.empty()) {
    std::string error(argv[1]);
    error += ": No Exif data found in the file";
    throw Exiv2::Error(1, error);
}
Exiv2::ExifData::const_iterator end = exifData.end();
for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
    const char* tn = i->typeName();
    std::cout << std::setw(44) << std::setfill(' ') << std::left
              << i->key() << " "
              << "0x" << std::setw(4) << std::setfill('0') << std::right
              << std::hex << i->tag() << " "
              << std::setw(9) << std::setfill(' ') << std::left
              << (tn ? tn : "Unknown") << " "
              << std::dec << std::setw(3)
              << std::setfill(' ') << std::right
              << i->count() << "  "
              << std::dec << i->value()
              << "\n";
}

return 0;
}
//catch (std::exception& e) {

//catch (Exiv2::AnyError& e) {

catch (Exiv2::Error& e) {
    std::cout << "Caught Exiv2 exception '" << e.what() << "'\n";
    return -1;
}
...