用EDSDK拍照并立即检索

本文关键字:检索 EDSDK | 更新日期: 2023-09-27 18:04:00

几天来我一直试图从相机中检索拍摄的照片。今天我发现

EdsSetPropertyData(cRef, PropID_SaveTo, 0, 4, 2);

不将图片保存到相机。但我的问题是目前我无法从相机中检索图像。我的ObjectEventHandler将永远不会被调用(有时在初始化时,它将被调用以前的图片)。这是我的调用者(在main函数中):

Camera camera = new Camera();
Thread thread = new Thread(new ThreadStart(camera.DoThings));
thread.Start();

这是我的CC类(camera control)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EDSDKLib;
namespace CCCBSv2
{
class CC : EDSDK
{
    IntPtr cRef;
    // Initilizes, takes picture and uninitilizes 
    public void RunSeq()
    {
        uint err;
        err = Initialize();
        if (err != EDS_ERR_OK)
        {
            return;
        }
        err = TakePicture();
        if (err != EDS_ERR_OK)
        {
            return;
        }
        Uninitilize();
    }
    public uint Initialize()
    {
        // err init
        uint err;
        // Initilize SDK.
        // SDK initilizion is needed to use EDSDK functions
        err = EdsInitializeSDK();
        // In case of error pass it on...
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        // get first camera connected to computer
        err = GetFirstCamera();
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        // Open session to camera
        EdsOpenSession(cRef);
        // Set object event handler, We need this event handler to retrieve pictures from camera
        err = EdsSetObjectEventHandler(cRef, ObjectEvent_All, ObjectEventHandler, IntPtr.Zero);
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        // We don't want to save pictures to the camera so lets set save target to host
        err = EdsSetPropertyData(cRef, PropID_SaveTo, 0, 4, 2);
        return err;
    }
    // uninitilizes edsdk
    public uint Uninitilize()
    {
        uint err;
        err = EdsCloseSession(cRef);
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        err = EdsTerminateSDK();
        return err;
    }
    // gets the first camera to cRef
    private uint GetFirstCamera()
    {
        // Variable initilazions
        IntPtr cameraList;
        uint err;
        int count;
        // Get list of cameras;
        err = EdsGetCameraList(out cameraList);
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        // Get count of cameras in list
        err = EdsGetChildCount(cameraList, out count);
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        if (count == 0)
        {
            return EDS_ERR_DEVICE_NOT_FOUND;
        }
        // Get first camera to public cRef
        err = EdsGetChildAtIndex(cameraList, 0, out cRef);
        if (err != EDS_ERR_OK)
        {
            return err;
        }
        // release camera list
        if (cameraList != null)
        {
            EdsRelease(cameraList);
        }
        // everything went just fine
        return EDS_ERR_OK;
    }
    public uint ObjectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext){
        switch (inEvent)
        {
            // in case of a download request
            case ObjectEvent_DirItemRequestTransfer:
                DownloadImage(inRef);
                break;
            default:
                break;
        }
        return EDS_ERR_OK;
    }
    // Downloads the picture from camera's buffer to the computer
    private uint DownloadImage(IntPtr dItem)
    {
        EdsDirectoryItemInfo dirInfo;
        uint err;
        IntPtr stream = new IntPtr();
        err = EdsGetDirectoryItemInfo(dItem, out dirInfo);
        if (err == EDS_ERR_OK)
        {
            err = EdsCreateFileStream(dirInfo.szFileName, EdsFileCreateDisposition.CreateAlways, EdsAccess.ReadWrite, out stream);
        }
        if (err == EDS_ERR_OK)
        {
            err = EdsDownload(dItem, dirInfo.Size, stream);
        }
        if (err == EDS_ERR_OK)
        {
            err = EdsDownloadComplete(dItem);
        }
        if (stream != null)
        {
            EdsRelease(stream);
        }
        return err;
    }
    // Takes picture
    public uint TakePicture()
    {
        return EdsSendCommand(cRef, CameraCommand_TakePicture, 0);
    }
}
}

用EDSDK拍照并立即检索

您将需要一个Windows消息循环来获取和分发事件。对象事件处理程序应该在您将此添加到main():

之后调用。
while(GetMessage(&msg, NULL, NULL, NULL))
{        
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
}

另外,记得将PropID_SaveTo设置为SaveTo_Host。你可以在这里看到我的帖子。

我正在为更好的佳能EOS支持。net工作。我把它叫做standard . eos . framework。我只是增加了拍照和下载他们的任何路径在您的计算机上的支持。该框架仍处于Alpha模式,但请随意测试。

我的第一个猜测是您UnInitialize驱动程序太快,在回调有机会被触发之前。

TakePicture只是告诉相机拍摄照片,您或多或少立即返回以取消初始化驱动程序。但实际上拍照需要移动机械部件,可能要花半天时间,当相机宣布拍摄完成时,已经没有监听器来记录信息了。