一、拍照
太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;
}
}
}