首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用EDSDK2.9从佳能相机检索图片

利用EDSDK2.9从佳能相机检索图片
EN

Stack Overflow用户
提问于 2010-11-30 05:31:28
回答 2查看 4.5K关注 0票数 2

很长一段时间以来,我一直试图取回相机上拍摄的图像。我可以通过以下方式与SDK一起拍照:

err = EDSDK.EdsSendCommand(cameraDev,EDSDK.CameraCommand_TakePicture,0);

在打开有效的相机会话后,我就这样做了。我还添加了一个

用于以下事件的objectEventHandler和stateEventHandler:

代码语言:javascript
复制
    public static uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext)
    {
        switch (inEvent)
        {
            case EDSDK.StateEvent_JobStatusChanged:
                Debug.WriteLine(String.Format("There are objects waiting to be transferred.  Job status {0}", inParameter));
                break;

            case EDSDK.StateEvent_ShutDownTimerUpdate:
                if (inParameter != 0)
                    Debug.WriteLine(String.Format("shutdown timer update: {0}", inParameter));
                break;

            default:
                Debug.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter));
                break;
        }
        return 0;
    }

代码语言:javascript
复制
    public static uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
    {
        switch (inEvent)
        {
            case EDSDK.ObjectEvent_VolumeInfoChanged:
                Debug.WriteLine("volume info changed");

                #region retrieve volume info

                EDSDK.EdsVolumeInfo volumeInfo;
                err = EDSDK.EdsGetVolumeInfo(inRef, out volumeInfo);
                if (err == EDSDK.EDS_ERR_OK)
                {
                    switch (volumeInfo.StorageType)
                    {
                        case (uint)EDSDK.EdsStorageType.Non:
                            Debug.WriteLine("No card inserted");
                            break;
                        default:
                        case (uint)EDSDK.EdsStorageType.CF:
                        case (uint)EDSDK.EdsStorageType.SD:
                            if (volumeInfo.Access == (uint)EDSDK.EdsAccess.ReadWrite)
                            {
                                Debug.WriteLine(String.Format("Label: {0}, Max Capacity: {1}, Free Space: {2}",
                                    volumeInfo.szVolumeLabel, volumeInfo.MaxCapacity, volumeInfo.FreeSpaceInBytes));

                                /*
                                err = EDSDK.EdsGetChildAtIndex(volumeInfo, 0, directoryList);
                                if (err != EDSDK.EDS_ERR_OK)
                                    throw new Exception(String.Format("EdsGetChildAtIndex: " + err.ToString()));
                                */
                            }
                            else
                                Debug.WriteLine(String.Format("Volume access rights: {0}", volumeInfo.Access));
                            break;
                    }
                }

                #endregion retrieve volume info

                break;

            case EDSDK.ObjectEvent_DirItemCreated:
                downloadImage(inContext);
                Debug.WriteLine("dir item created");
                break;

            default:
                Debug.WriteLine(String.Format("ObjectEventHandler: event {0}", inEvent));
                break;
        }
        return 0;
    }

我尝试过多种方法(检索此图像),但似乎没有一种方法有效。其中一些办法是:

http://tech.groups.yahoo.com/group/CanonSDK/message/1575

http://stackoverflow.com/questions/3762530/take-picture-and-directly-save-image-to-pc-using-edsdk-2-8

http://canonsdk.com/phpBB3/viewtopic.php?f=7&t=94&sid=7fcbe7ad6eadb399dbcb4b61a7333112

问题是,它们都只是代码的一部分,当我尝试将它放入我的代码中时,它从来没有工作过properly.Probably,因为我不是memoryStreams方面的专家,指点和说明。我遇到的大多数错误都是在读取流并将它们复制到本地缓冲区时,它说流是空的。

有没有人有完整的示例代码来拍摄一张照片并下载到磁盘(或内存),或者我需要的严格的方法来完成这个任务?

谢谢费尔南多

EN

回答 2

Stack Overflow用户

发布于 2012-09-27 01:39:54

代码中的错误是:

代码语言:javascript
复制
downloadImage(inContext);

它应该是

代码语言:javascript
复制
 downloadImage(inRef);
票数 1
EN

Stack Overflow用户

发布于 2012-04-11 06:30:45

将捕获映像作为文件下载到硬盘中,您可以将其签出。

代码语言:javascript
复制
void DownloadImage(IntPtr DirectoryRef)
{
    IntPtr stream = IntPtr.Zero;

    try
    {
        Error = EDSDK.EdsGetDirectoryItemInfo(DirectoryRef, out dirItemInfo);

        if (Error == OK)
        {
            Error = EDSDK.EdsCreateFileStream(dirItemInfo.szFileName,
            EDSDK.EdsFileCreateDisposition.CreateAlways, EDSDK.EdsAccess.ReadWrite, out stream);
        }

        if (Error == OK)
        {
            Error = EDSDK.EdsDownload(DirectoryRef, dirItemInfo.Size, stream);
        }

        if (Error == OK)
        {
            Error = EDSDK.EdsDownloadComplete(DirectoryRef);
        }
        else
        {
            Error = EDSDK.EdsDownloadCancel(DirectoryRef);
        }

        Error = EDSDK.EdsGetPointer(stream, out data);
        if (Error != OK)
                throw new Exception("Invalid Pointer Handler. Error Code:" + err.getErrorName(Error) + "(" + Error + ")" );

        Error = EDSDK.EdsGetLength(stream, out size);

        Bitmap retImage = null;
   }
   catch (Exception ex)
   {

   }

   EDSDK.EdsRelease(stream);
   EDSDK.EdsRelease(data);            
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4310814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档