Как установить / получить свойства снимков, сделанных с помощью canon EDSDK 2.12?

Я новичок в программировании на С ++ и начинаю использовать Canon EDSDK 2.12 для дистанционного управления зеркальной камерой EOS 600D. Я использовал этот код, чтобы лучше понять, как получить доступ к камере и сделать один снимок, и он отлично работает, но теперь я не уверен, как продолжить работу с моей программой, потому что я не могу понять возможности SDK с Справочник по программированию.

Можно ли сделать снимок, сохраненный на camaeras SD, с индивидуальным именем?

если не

Как мне создать обработчик событий? Я хотел бы получать строку, состоящую из пути к изображению на SD (имя папки и изображения в качестве уникального идентификатора) каждый раз, когда делается снимок, и выполнять с ним некоторые другие задачи.

Я надеюсь, что это помогает понять, что я хочу сделать.

2 ответа

Это описано в документации по SDK и, вероятно, немного запоздало для вас, но может быть полезно для других.

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

Err = EdsSetObjectEventHandler( Camera, kEdsObjectEvent_All, HandleAllObjectEvents, NULL);

В ответ на обратный вызов Canon SDK для события объекта (то есть в функции HandleAllObjectEvents) вы можете сделать что-то вроде:

switch ( inEvent ) {
    case kEdsObjectEvent_DirItemCreated:
        // new file created on camera card
        EdsDirectoryItemRef fileNameRef;
        EdsDirectoryItemRef folderNameRef;
        EdsDirectoryItemInfo fileNameInfo;
        EdsDirectoryItemInfo folderNameInfo;

        fileNameRef = (EdsDirectoryItemRef)inObject;
        EdsGetDirectoryItemInfo( fileNameRef, &fileNameInfo );  // got the file name and some other info
        EdsGetParent( fileNameRef, &folderNameRef );
        EdsGetDirectoryItemInfo( folderNameRef, &folderNameInfo );  // got the folder name

        char fname[100];
        strcpy( fname, folderNameInfo.szFileName );
        strcat( fname, "\\" );
        strcat( fname, fileNameInfo.szFileName );

Как вы знаете, получить имя папки важно, если вы делаете много фотографий, так как имя файла переключается с IMG_9999.jpg на IMG_0000.jpg, а файлы помещаются в новую папку (например, от 100CANON до 101CANON. Просто использование имени файла не гарантирует уникальное имя.

Я могу придумать несколько решений.

  1. Windows имеет API (FindFirstChangeNotification а такжеFindNextChangeNotificaton), что позволяет обнаруживать изменения в каталоге. Просто используйте "диск", на котором камера представлена ​​как на компьютере, как "здесь я хочу видеть уведомления". Я никогда не программировал на Mac, но у него, похоже, есть что-то под названием FSEvents, которое будет делать что-то подобное.

  2. Вы можете положиться на камеру, чтобы сохранить изображение под постоянным именем. Когда ваше приложение запустится, найдите последний файл на диске, который является хранилищем камеры. Затем просто пронумеруйте его "IMG_0991.JPG" [замените "JPG" на "CR2", если вы используете режим RAW], и ​​получите "IMG_0992.JPG". Это работает каждый раз, все время. В конечном итоге он будет перенесен на IMG_0001.JPG, когда вы взяли 10000 изображений (и, вероятно, переместится в новый каталог с именем "DCIM/101CANON" вместо "DCIM/100CANON").

  3. Просканируйте каталог и сохраните список всех файлов. Затем отсканируйте это снова. Это может занять некоторое время, если изображений много.

Другие вопросы по тегам