佳能 SDK - 将图像下载到主机 PC

Posted

技术标签:

【中文标题】佳能 SDK - 将图像下载到主机 PC【英文标题】:Canon SDK - Downloading image to host PC 【发布时间】:2013-09-05 03:57:20 【问题描述】:

我正在尝试将佳能相机拍摄的图像从其 SD 卡下载到主机 PC,我编写了代码以便它可以拍摄并且不再将其保存在 SD 卡上,但我找不到它也可以在主机 PC 上。有人有方向吗??我的主要和功能如下所示,不包括 getFirstCamera 功能。

我根本不知道回调函数等是如何工作的。所以如果有需要修复的问题,如果有人能提供 sn-ps 代码,那就太好了

#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;

【问题讨论】:

【参考方案1】:

当您调用 EdsCreateFileStream 时,只需将完全限定的路径添加到您希望文件所在的位置。 dirItemInfo.szFileName 只是文件名,因此如果不包含路径,图像应该出现在您的工作目录中。

【讨论】:

以上是关于佳能 SDK - 将图像下载到主机 PC的主要内容,如果未能解决你的问题,请参考以下文章

佳能 EDSDK 在我的电脑中保存图像

更好的 .NET SDK 支持——佳能还是尼康? [关闭]

iOS 5.0 SDK - USB 主机 OTG

使用edsdk 2.8拍照并直接将图像保存到PC

佳能数字 SDK (EDSDK) EdsCreateImageRef 错误

SDK 错误:0x8D07,在 C# 中使用 Canon SDK 时