канон EDSDK сохранение изображения на моем компьютере

Я использую EDSDK v2.13 с моей камерой EOS 50D.
Я хочу сохранить сделанные фотографии в моем хосте. Я использую этот код (C ++):

    EdsOpenSession(camera);
EdsInt32 saveTarget = kEdsSaveTo_Both;
err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

EdsCapacity newCapacity = {0x7FFFFFFF, 0x1000, 1};
err = EdsSetCapacity(camera, newCapacity);

const char* ch_dest = "C:\\photo\\Img.jpg";
EdsCreateFileStreamEx( ch_dest ,kEdsFileCreateDisposition_CreateNew,kEdsAccess_ReadWrite, 0);

EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
EdsCloseSession(camera);
EdsTerminateSDK();

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

Пожалуйста помоги.

2

Решение

это не работает таким образом. После того, как вы сделали фотографию, вам нужно поймать ObjectEvent, а затем загрузить файл. Это работает примерно так:

  • Открытая сессия
  • Установите SaveTo_Both или Host
  • Установить емкость
  • Подписаться на событие объекта с EdsSetObjectEventHandler
  • Сфотографировать
  • Событие объекта должно начинаться с того, что «inEvent» является «kEdsObjectEvent_DirItemRequestTransfer»
  • Загрузите данные:
    • Получить информацию с EdsGetDirectoryItemInfo, где «inDirItemRef» является «inRef» из события
    • Создать поток файлов с EdsCreateFileStream
    • Загрузите данные с помощью EdsDownload (inRef из события, размер из DirectoryItemInfo)
    • Пометить как законченное с помощью EdsDownloadComplete (inRef из события)
    • Освободить данные с помощью EdsRelease (inRef из события)
    • Освободите поток с помощью EdsRelease

Мне жаль, что я не могу предоставить вам реальный код, я не разработчик C ++. Если вы хотите, я могу показать вам немного кода на C #. Чтобы получить более подробную информацию о том, как работают функции, вы также можете проверить документацию SDK.

С уважением

Редактировать:

Хорошо, немного кода C ++ с помощью документации:
Обратите внимание, что так оно и будет работать в его наименьшей форме. Вы всегда должны проверять, если err! = EDS_ERR_OK. И вам следует вызывать Закрыть только после того, как изображение было загружено.

void TakePhoto()
{
EdsError err = EDS_ERR_OK;
EdsCameraRef camera = NULL;
EdsCameraListRef cameraList = NULL;
EdsUInt32 count = 0;

err = EdsInitializeSDK();
err = EdsGetCameraList(&cameraList);
err = EdsGetChildCount(cameraList, &count);
if (count > 0)
{
err = EdsGetChildAtIndex(cameraList, 0, &camera);
cameraList = NULL;
err = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All, handleObjectEvent, NULL);
err = EdsOpenSession(camera);
err = EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
}
}

void Close(EdsCameraRef *camera)
{
err = EdsCloseSession(camera);
EdsRelease(camera);
EdsTerminateSDK();
}

static EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context)
{
if (event == kEdsObjectEvent_DirItemRequestTransfer)
{
EdsError err = EDS_ERR_OK;
EdsStreamRef stream = NULL;
EdsDirectoryItemInfo dirItemInfo;
err = EdsGetDirectoryItemInfo(object, &dirItemInfo);
err = EdsCreateFileStream(dirItemInfo.szFileName, kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream);
err = EdsDownload(object, dirItemInfo.size, stream);
err = EdsDownloadComplete(object);
EdsRelease(stream);
stream = NULL;
}
if (object) EdsRelease(object);
}
6

Другие решения

Других решений пока нет …