zoomRect,zoomCoordinates在Canon EDSDK中带来PROPERTİES_UNAVAILABLE错误

时间:2018-02-06 03:50:34

标签: c# .net zooming canon-sdk

我可以使用canon sdk使用codeproject中的这个库 Canon EDSDK Library

使用SDK和上面提到的库,我必须向上/向下/向左/向右移动缩放的实时视图。我可以放大但我无法移动它以查看调整手动变焦的正确位置。

我已经搜索过了zoomRect,zoomPosition,zoomCoordinates然后我将这两个方法添加到camera.cs中,并在我获得evfImageRef之后从DownloadEvf()方法调用它们。然后我将它传递给方法。但是创建了一个rect,但每次都会改变,而且值很疯狂。错误代码是Properties_unavailable

另一点是SDK中的zoompositon也无法正常工作,或者我无法使其工作,因此它提供了不支持的错误。我也在为它添加代码。

Rectangle对象是EOSDigital.SDK.Rectangle对象。 CanonSDK是EOSDigital.SDK.CanonSDK对象。 MainCamera是Camera对象。

    private Rectangle GetEvfZoomRect(IntPtr imgRef)
    {

        int size = Marshal.SizeOf(typeof(Rectangle));
        IntPtr ptr = Marshal.AllocHGlobal(size);
        ErrorCode err = CanonSDK.EdsGetPropertyData(imgRef, PropertyID.Evf_ZoomRect, 0, size, ptr);
        Rectangle rect = (Rectangle)Marshal.PtrToStructure(ptr, typeof(Rectangle));
        Marshal.FreeHGlobal(ptr);
        if (err == ErrorCode.OK)
            return rect;
        else
            return new Rectangle();
    }

    private Size GetEvfCoord(IntPtr imgRef)
    {
        int size = Marshal.SizeOf(typeof(Size));
        IntPtr ptr = Marshal.AllocHGlobal(size);

        ErrorCode err = CanonSDK.EdsGetPropertyData(imgRef, PropertyID.Evf_CoordinateSystem, 0, size, ptr);
        Size coord = (Size)Marshal.PtrToStructure(ptr, typeof(Size));
        Marshal.FreeHGlobal(ptr);
        if (err == ErrorCode.OK)
            return coord;
        else
            return new Size();
    }

这就是我尝试发送缩放位置的方法

        if (MainCamera.IsLiveViewOn)
        {
            EOSDigital.SDK.Point p = new EOSDigital.SDK.Point(100, 300);

            MainCamera.SetSetting(PropertyID.Evf_ZoomPosition, p);

        }

1 个答案:

答案 0 :(得分:0)

这是我找到的解决方案。使用此方法设置相机的变焦位置。我在库中的camera.cs中定义了这个方法

    public void SetZoomPositionSetting(PropertyID propID, Point value, int inParam = 0)
    {
        CheckState();

        int size = Marshal.SizeOf(typeof(Point));
        ErrorCode err = CanonSDK.EdsSetPropertyData(CamRef, propID, inParam, size, value);
    }

我已将此数据发送到方法以更改zoomPosition

MainCamera.SetZoomPositionSetting(PropertyID.Evf_ZoomPosition, p);
这里的p是EOSDigital.SDK.Point实例。

以下是获取zoomCoordinates,zoomRect的方法。我在库中的camera.cs中定义了这些方法

   private Rectangle GetEvfZoomRect(IntPtr imgRef)
    {
        Rectangle rect = new Rectangle();

        ErrorCode err = CanonSDK.GetPropertyData(imgRef, PropertyID.Evf_ZoomRect, 0, out rect);
        if (err == ErrorCode.OK)
            return rect;
        else
            return rect = new Rectangle();

    }

    private Size GetEvfCoord_Size(IntPtr imgRef)
    {
        Size size = new Size();

        ErrorCode err = CanonSDK.GetPropertyData(imgRef, PropertyID.Evf_CoordinateSystem, 0, out size);
        if (err == ErrorCode.OK)
            return size;
        else
            return new Size();
    }

您需要在camera.cs中的DownloadEvf()方法中调用这些方法。从中获取evfImageRef之后     CanonSDK.EdsDownloadEvfImage(CamRef,evfImageRef);

NOT FROM CanonSDK.EdsCreateEvfImageRef(stream.Reference,out evfImageRef); 这就是为什么我有这个错误

使用图像数据获取evfImageRef后,可以使用evfImageRef作为imgRef调用get方法。

您可以使用相同的方式获得zoomposition。 注意:每次进行更改时,都需要重建库。