【问题标题】:Rotate canon liveview image by 180°将佳能实时取景图像旋转 180°
【发布时间】:2019-11-15 11:11:34
【问题描述】:

我是 C# 新手,现在使用佳能的 EDSDK 在图片框中实时查看相机。如何将实时取景图像旋转 180°?

我尝试在 liveView 建立后旋转图像


MainForm.cs

Camera MainCamera;  // is instanciated elsewhere
public void startLiveView() {

    MainCamera.StartLiveView();

    // at this point, live-view is working and LiveViewPicBox contains the live-view
    // this code has no effect:
    Image img = LiveViewPicBox.Image;
    img.RotateFlip(RotateFlipType.Rotate180FlipY);
    LiveViewPicBox.Image = img;
}

Camera.cs

public void StartLiveView()
{
    CheckState();
    if (!IsLiveViewOn) SetSetting(PropertyID.Evf_OutputDevice, (int)EvfOutputDevice.PC);
}

public void SetSetting(PropertyID propID, object value, int inParam = 0)
{
    CheckState();

    MainThread.Invoke(() =>
    {
        int propsize;
        DataType proptype;
        ErrorHandler.CheckError(this, CanonSDK.EdsGetPropertySize(CamRef, propID, inParam, out proptype, out propsize));
        ErrorHandler.CheckError(this, CanonSDK.EdsSetPropertyData(CamRef, propID, inParam, propsize, value));
    });
}

SDKMethods.cs (CanonSDK)

[DllImport(DllPath)]
public extern static ErrorCode EdsGetPropertySize(IntPtr inRef, PropertyID inPropertyID, int inParam, out DataType outDataType, out int outSize);


[DllImport(DllPath)]
public extern static ErrorCode EdsSetPropertyData(IntPtr inRef, PropertyID inPropertyID, int inParam, int inPropertySize, [MarshalAs(UnmanagedType.AsAny), In] object inPropertyData);

实时视图正在运行,但未应用旋转。

注意:pictureBox 有属性WaitOnLoad=false

我假设我需要旋转某种图像流,尽管我不太了解 SDK 中的大部分代码。谁能帮助我,告诉我从哪里开始?

【问题讨论】:

  • 这是一个 WinForms 应用程序吗?您是否能够显示有关如何创建 LiveViewPicBox(属性等)的更多详细信息。你想在什么事件中使用你的代码?这就是访问图像或图片框的事件中的所有代码吗?
  • 我用更详细的代码更新了我的问题。这是一个 WinForms 应用程序。
  • LiveViewPicBox 是一个简单的图片框,没有分配特殊属性。这是我正在使用的EDSDK 示例。按钮点击触发MainForm.startLiveView()
  • 老实说,我什至看不到 SDK 代码中图片框上实际图像(流?)的设置位置。不管我挖多深。
  • 您发布的旋转图像的代码是正确的。这可以通过创建一个新的 WinForms 应用程序来验证,该应用程序包含一个带有图像的 PictureBox,以及一个带有用于旋转它的代码的按钮。我的预感是由于未在 UI 线程上完成 LiveView,因此 PictureBox 未更新。

标签: c# winforms edsdk canon-sdk


【解决方案1】:

看起来您正在使用我的 CodeProject 教程。在这种情况下,您正在寻找错误的东西。示例中有两个相关方法,LiveViewUpdated 事件处理程序传递当前实时视图帧(称为MainCamera_LiveViewUpdated)和实际绘制实时视图的图片框绘制事件(称为LiveViewPicBox_Paint

MainCamera_LiveViewUpdated 中,当前帧被读入Bitmap 并且图片框被“通知”它应该重绘自己。

LiveViewPicBox_Paint 方法中,您会看到实际并未使用图片框图像,而是使用Graphics 对象直接将图像绘制到控件上,该对象由PaintEventArgs 传递给您(这已完成出于性能原因)。

现在,您已经拥有Graphics 对象和实时取景框,您可以随意绘制它。对于轮换,请在此处查看此答案:Rotating graphics?

【讨论】:

  • 神奇的发现了这个问题!可悲的是,我在项目的任何地方都找不到SDK_LiveViewUpdatedCreateGraphics。 (但发现这一行://Update live viewLiveViewUpdated?.Invoke(this, stream);
  • 对不起@Jonathan,我看错了例子,我现在已经更新了正确答案的答案。这一切都发生在 MainForm.cs 文件中。另外,我会收到有关 Canon SDK 问题的通知;)
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多