下载图片从佳能相机到电脑的问题

时间:2010-09-26 05:11:01

标签: c# .net events edsdk

我将eos佳能相机连接到了电脑上 我有一个应用程序,我可以远程拍照,并将图像下载到电脑,

但是当我从相机中取出SD卡时,我无法将图像从缓冲区下载到PC

//注册objceteventcallback

err = EDSDK.EdsSetObjectEventHandler(obj.camdevice, EDSDK.ObjectEvent_All, objectEventHandler, new IntPtr(0));
              if (err != EDSDK.EDS_ERR_OK)
                 Debug.WriteLine("Error registering object event handler");

///

public uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
        {
            switch(inEvent)
            {

                case EDSDK.ObjectEvent_DirItemCreated:

                    this.getCapturedItem(inRef);

                    Debug.WriteLine("dir item created");

                    break;
                case EDSDK.ObjectEvent_DirItemRequestTransfer:
                    this.getCapturedItem(inRef);
                    Debug.WriteLine("file transfer request event");
                    break;

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

任何人都可以帮助我,为什么这个事件不会打电话,

或者我如何将图像从缓冲区下载到电脑上,而我的相机上没有SD卡

感谢

3 个答案:

答案 0 :(得分:2)

你可能遇到了和昨天一样的问题:相机试图存储图像供以后下载,找不到存储卡存储它并立即丢弃图像。

要使您的回叫触发,您需要将相机设置为在相机初始化例程期间的某个时刻将图像保存到PC(kEdsSaveTo_Host)。在C ++中,它的工作原理如下:

    EdsInt32 saveTarget = kEdsSaveTo_Host;
    err = EdsSetPropertyData( _camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

您可能需要为此构建一个IntPtr。至少,这就是Dmitriy Prozorovskiy在this thread中所做的(由某个 akadunno 提示)。

答案 1 :(得分:0)

SDK(据我所知)仅以在相机文件系统(即SD卡)上创建的对象的形式公开图片拍摄事件。我不熟悉从缓冲区捕获的方法。在某种程度上这是有道理的,因为在只有少量板载内存的环境中,保持易失性存储器清晰以便它可以继续拍照是很重要的。将缓冲区刷新到非易失性存储器后,您就可以清楚地与这些字节进行交互。限制,我知道,但它就是它。

答案 2 :(得分:0)

这个问题要求C#,但在Java中,必须将setProperty作为:

NativeLongByReference number = new NativeLongByReference( new NativeLong( EdSdkLibrary.EdsSaveTo.kEdsSaveTo_Host ) );
    EdsVoid data = new EdsVoid( number.getPointer() ); 
    NativeLong l = EDSDK.EdsSetPropertyData(edsCamera, new NativeLong(EdSdkLibrary.kEdsPropID_SaveTo), new NativeLong(0), new NativeLong(NativeLong.SIZE), data);

通常下载会做