Я пытаюсь загрузить изображения, снятые моей камерой canon, с ее SD-карты на хост-компьютер, я написал код, чтобы он делал снимок и больше не сохранял его на SD-карте, но не могу найти его на хост компьютер тоже. У кого-нибудь есть направления ?? Мои основные функции и функции показаны ниже, за исключением функции getFirstCamera.
Я на самом деле не знаю, как работают функции обратного вызова и т. Д., Поэтому было бы здорово, если бы кто-нибудь мог предоставить фрагменты кода, если есть вещи, которые нужно исправить
#include <stdio.h>
#include "EDSDK.h"#include "EDSDKTypes.h"#include "EDSDKErrors.h"
EdsError getFirstCamera(EdsCameraRef *camera);
EdsError downloadImage(EdsDirectoryItemRef directoryItem);
EdsError EDSCALLBACK handleStateEvent (EdsStateEvent event,EdsUInt32 parameter,EdsVoid * context);
EdsError EDSCALLBACK handleObjectEvent( EdsObjectEvent event,EdsBaseRef object,EdsVoid * context);
EdsError EDSCALLBACK handlePropertyEvent (EdsPropertyEvent event,EdsPropertyID property,EdsUInt32 inParam, EdsVoid * context);int main(int argc, char **argv)
{
EdsError err;
EdsCameraRef camera = NULL;
bool isSDKLoaded = false;
EdsCapacity capacity = {0x7FFFFFFF, 0x1000, 1};
EdsInt32 saveTarget = kEdsSaveTo_Host;
// Initialize SDK
err = EdsInitializeSDK();
if(err == EDS_ERR_OK)
{
isSDKLoaded = true;
}
// Get first camera
if(err == EDS_ERR_OK)
{
err = getFirstCamera (&camera);
}// Open session with camera
err = EdsOpenSession(camera);
// Set event handler
if(err == EDS_ERR_OK) err = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All,handleObjectEvent, NULL);
if(err == EDS_ERR_OK) err = EdsSetPropertyEventHandler(camera, kEdsPropertyEvent_All,handlePropertyEvent, NULL);
if(err == EDS_ERR_OK) err = EdsSetCameraStateEventHandler(camera, kEdsStateEvent_All,handleStateEvent, NULL);
err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );
err = EdsSetCapacity(camera, capacity);
///// Take picture
err = EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
////
// Close session with camera
if(err == EDS_ERR_OK)
{
err = EdsCloseSession(camera);
}
// Release camera
if(camera != NULL)
{
EdsRelease(camera);
}
// Terminate SDK
if(isSDKLoaded)
{
EdsTerminateSDK();
}
}EdsError EDSCALLBACK handleObjectEvent( EdsObjectEvent event,EdsBaseRef object,EdsVoid * context)
{
EdsError err=EDS_ERR_OK;
switch(event)
{
case kEdsObjectEvent_DirItemRequestTransfer:
err = downloadImage(object);
break;
default:
break;
}
// Object must be released
if(object){
err = EdsRelease(object);
}
return err;
}
EdsError EDSCALLBACK handlePropertyEvent (EdsPropertyEvent event,EdsPropertyID property,EdsUInt32 inParam, EdsVoid * context)
{
return EDS_ERR_OK;
}
EdsError EDSCALLBACK handleStateEvent (EdsStateEvent event,EdsUInt32 parameter,EdsVoid * context)
{
return EDS_ERR_OK;
}
EdsError downloadImage(EdsDirectoryItemRef directoryItem)
{
EdsError err = EDS_ERR_OK;
EdsStreamRef stream = NULL;
// Get directory item information
EdsDirectoryItemInfo dirItemInfo;
err = EdsGetDirectoryItemInfo(directoryItem, & dirItemInfo);
// Create file stream for transfer destination
if(err == EDS_ERR_OK)
{
err = EdsCreateFileStream( dirItemInfo.szFileName,kEdsFileCreateDisposition_CreateAlways,kEdsAccess_ReadWrite, &stream);
}
// Download image
if(err == EDS_ERR_OK)
{
err = EdsDownload( directoryItem, dirItemInfo.size, stream);
}
// Issue notification that download is complete
if(err == EDS_ERR_OK)
{
err = EdsDownloadComplete(directoryItem);
}
// Release stream
if( stream != NULL)
{
EdsRelease(stream);
stream = NULL;
}
return err;
}
Когда вы вызываете EdsCreateFileStream, просто добавьте полный путь, по которому вы хотите, чтобы файл шел. dirItemInfo.szFileName — это только имя файла, поэтому изображение должно отображаться в вашем рабочем каталоге, если вы не указали путь.
Других решений пока нет …