zoomRect、zoomCoordinates 在佳能 EDSDK 中带来 PROPERTİES_UNAVAILABLE 错误

zoomRect, zoomCoordinates brings PROPERTİES_UNAVAILABLE error in Canon EDSDK

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

使用 SDK 和上面提到的库,我必须移动缩放的实时视图 up/down/left/right。我可以缩放,但我无法移动它来查看调整手动缩放的正确位置。

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

另一点是 SDK 中的 zoompositon 也不起作用,或者我无法使其起作用,所以它给出了不受支持的错误。我也在为它添加代码。

矩形对象是 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);

        }

这是我找到的解决方案。使用此方法设置相机的变焦位置。我在 library

的 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 in library

中定义了这些方法
   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);

不是来自 CanonSDK.EdsCreateEvfImageRef(stream.Reference,出 evfImageRef); 这就是为什么我得到那个错误

在获得带有图像数据的 evfImageRef 后,您可以使用 evfImageRef 作为 imgRef 调用 get 方法。

你可以用同样的方法得到缩放位置。 注意:顺便说一句,每次更改后,都需要重建库。