C# 佳能(Canon)相机EDSDK应用开发(二)--Live view与拍照

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 18:04   4413   0
上一节看过了基本的应用开发流程,本节来看一下如何控制相机进行实时预览及拍照

一、拍照

太EASY了,就这么一句:

EDSDK.EdsSendCommand(camera, EDSDK.CameraCommand_TakePicture, 0);

*注意:相机应确保在MF上。

二、实时预览(Live view)

就是将evf(Electronic Viewfinder--电子取景器)输出到PC上显示。

1、设置输出设备为PC:

uint _data;
EDSDK.EdsDataType _dataType;
int _dataSize;

//先获取原来的EVF输出设备属性的信息

_hr = EDSDK.EdsGetPropertySize(camera, EDSDK.PropID_Evf_OutputDevice, 0, out _dataType, out _dataSize);
_hr = EDSDK.EdsGetPropertyData(this._camera, EDSDK.PropID_Evf_OutputDevice, 0, out _data);
IntPtr _device = new IntPtr();
if (_hr == EDSDK.EDS_ERR_OK)
{

//设置输出到PC
_device = new IntPtr(_data | EDSDK.EvfOutputDevice_PC);
_hr = EDSDK.EdsSetPropertyData(camera, EDSDK.PropID_Evf_OutputDevice, 0, Marshal.SizeOf(_device), _device);

}

2、在UI中显示

*Live view到PC,需要不停的下载图象到PC,所以需要有个线程来做,用ThreadStart类。

private unsafe void DownloadEvfData()
{
//开始实时取景
while (true)
{
IntPtr _stream = IntPtr.Zero;
IntPtr _image = new IntPtr();
IntPtr _imageData = new IntPtr();
uint _imageLen;
if (_hr == EDSDK.EDS_ERR_OK)
{
_hr = EDSDK.EdsCreateMemoryStream(0, out _stream);
}
if (_hr == EDSDK.EDS_ERR_OK)
{
_hr = EDSDK.EdsCreateEvfImageRef(_stream, out _image);
}
//下载
if (_hr == EDSDK.EDS_ERR_OK)
{

//此处需要图象从内存流已经准备好

EDSDK.EdsDownloadEvfImage(this._camera, _image);
}
//显示图象
EDSDK.EdsGetPointer(_stream, out _imageData);
EDSDK.EdsGetLength(_stream, out _imageLen);

UnmanagedMemoryStream ums = new UnmanagedMemoryStream((byte*)_imageData.ToPointer(), _imageLen, _imageLen, FileAccess.Read);
_bmp = new Bitmap(ums, true);

//_picBox是定义的一个pictureBox 控件

_picBox.Image = _bmp;

if (_stream != IntPtr.Zero)
{
EDSDK.EdsRelease(_stream);
_stream = IntPtr.Zero;
}
if (_image != IntPtr.Zero)
{
EDSDK.EdsRelease(_image);
_image = IntPtr.Zero;
}
}
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP