将佳能实时取景图像旋转 180°
Rotate canon liveview image by 180°
我是 C# 的新手,现在使用 Canon 的 EDSDK 在 pictureBox 中实时查看相机。实时取景图像如何旋转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);
实时取景正常,但未应用旋转。
注:图片框有属性WaitOnLoad=false
我假设我需要旋转某种图像流,尽管我不太了解 SDK 中的大部分代码。谁能帮助我,告诉我从哪里开始?
看来您正在使用我在 CodeProject 中的教程。在那种情况下,你看错了东西。示例中有两个相关方法,传递当前实时视图帧的LiveViewUpdated
事件处理程序(称为MainCamera_LiveViewUpdated
)和实际绘制实时视图的图片框绘制事件(称为LiveViewPicBox_Paint
)
在 MainCamera_LiveViewUpdated
中,当前帧被读入 Bitmap
并且图片框 "notified" 它应该重绘自己。
在 LiveViewPicBox_Paint
方法中,您会看到实际上并未使用图片框图像,而是使用 Graphics
传递给您的对象直接将图像绘制到控件上=17=](这是出于性能原因)。
现在,您已经有了 Graphics
对象和实时取景框,您可以按照自己喜欢的方式绘制它。对于轮换,请在此处查看此答案:Rotating graphics?
我是 C# 的新手,现在使用 Canon 的 EDSDK 在 pictureBox 中实时查看相机。实时取景图像如何旋转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);
实时取景正常,但未应用旋转。
注:图片框有属性WaitOnLoad=false
我假设我需要旋转某种图像流,尽管我不太了解 SDK 中的大部分代码。谁能帮助我,告诉我从哪里开始?
看来您正在使用我在 CodeProject 中的教程。在那种情况下,你看错了东西。示例中有两个相关方法,传递当前实时视图帧的LiveViewUpdated
事件处理程序(称为MainCamera_LiveViewUpdated
)和实际绘制实时视图的图片框绘制事件(称为LiveViewPicBox_Paint
)
在 MainCamera_LiveViewUpdated
中,当前帧被读入 Bitmap
并且图片框 "notified" 它应该重绘自己。
在 LiveViewPicBox_Paint
方法中,您会看到实际上并未使用图片框图像,而是使用 Graphics
传递给您的对象直接将图像绘制到控件上=17=](这是出于性能原因)。
现在,您已经有了 Graphics
对象和实时取景框,您可以按照自己喜欢的方式绘制它。对于轮换,请在此处查看此答案:Rotating graphics?