代码之家  ›  专栏  ›  技术社区  ›  smoothumut

zoomRect,zoomCoordinates在Canon EDSDK中带来属性ES\U不可用错误

  •  0
  • smoothumut  · 技术社区  · 7 年前

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

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

    我已经搜索过了,我来到了zoomRect,ZoomComposition,zoomCoordinates,然后我将这两种方法添加到相机中。在我得到evfImageRef之后,从DownloadEvf()方法调用它们。然后我将其传递给方法。但是创建了一个rect,但每次都会更改,而且值都是疯狂的。错误代码为Properties\u unavailable

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

    矩形对象是EOSDigital。SDK。矩形对象。 CanonSDK是EOSDigital。SDK。CanonSDK对象。 MainCamera是摄影机对象。

        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 回复  |  直到 7 年前
        1
  •  0
  •   smoothumut    7 年前

    这是我找到的解决方案。使用此方法可以设置相机的缩放位置。我已经在相机中定义了这个方法。库中的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);
        }
    

    我已将此数据发送到方法以更改缩放位置

    MainCamera.SetZoomPositionSetting(PropertyID.Evf_ZoomPosition, p);
    

    这里的p是EOSDigital。SDK。点实例。

    以下是获取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中的DownloadEvf()方法中调用这些方法。反恐精英。刚刚从中获取evfImageRef
    CanonSDK。EDS下载EVFIMAGE(CamRef、evfImageRef);

    不是来自CanonSDK。EdsCreateEvfImageRef(stream.Reference,out evfImageRef); 这就是我出错的原因

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

    您可以使用相同的方法获得缩放。 注意:顺便说一下,每次进行更改时,都需要重建库。

    推荐文章