Я использую 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();
Затвор камеры срабатывает нормально, и я нахожу изображение на карте памяти своей камеры, но не могу найти его на своем ПК.
Пожалуйста помоги.
это не работает таким образом. После того, как вы сделали фотографию, вам нужно поймать ObjectEvent, а затем загрузить файл. Это работает примерно так:
Мне жаль, что я не могу предоставить вам реальный код, я не разработчик 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);
}
Других решений пока нет …