我一直在尝试检索相机拍摄的图像很长一段时间。我可以使用SDK拍照:
err = EDSDK.EdsSendCommand(cameraDev,EDSDK.CameraCommand_TakePicture,0);
我打开有效的相机会话后这样做。我还添加了一个
objectEventHandler和stateEventHandler,用于看起来像这样的事件:
public static uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext)
{
switch (inEvent)
{
case EDSDK.StateEvent_JobStatusChanged:
Debug.WriteLine(String.Format("There are objects waiting to be transferred. Job status {0}", inParameter));
break;
case EDSDK.StateEvent_ShutDownTimerUpdate:
if (inParameter != 0)
Debug.WriteLine(String.Format("shutdown timer update: {0}", inParameter));
break;
default:
Debug.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter));
break;
}
return 0;
}
public static uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
{
switch (inEvent)
{
case EDSDK.ObjectEvent_VolumeInfoChanged:
Debug.WriteLine("volume info changed");
#region retrieve volume info
EDSDK.EdsVolumeInfo volumeInfo;
err = EDSDK.EdsGetVolumeInfo(inRef, out volumeInfo);
if (err == EDSDK.EDS_ERR_OK)
{
switch (volumeInfo.StorageType)
{
case (uint)EDSDK.EdsStorageType.Non:
Debug.WriteLine("No card inserted");
break;
default:
case (uint)EDSDK.EdsStorageType.CF:
case (uint)EDSDK.EdsStorageType.SD:
if (volumeInfo.Access == (uint)EDSDK.EdsAccess.ReadWrite)
{
Debug.WriteLine(String.Format("Label: {0}, Max Capacity: {1}, Free Space: {2}",
volumeInfo.szVolumeLabel, volumeInfo.MaxCapacity, volumeInfo.FreeSpaceInBytes));
/*
err = EDSDK.EdsGetChildAtIndex(volumeInfo, 0, directoryList);
if (err != EDSDK.EDS_ERR_OK)
throw new Exception(String.Format("EdsGetChildAtIndex: " + err.ToString()));
*/
}
else
Debug.WriteLine(String.Format("Volume access rights: {0}", volumeInfo.Access));
break;
}
}
#endregion retrieve volume info
break;
case EDSDK.ObjectEvent_DirItemCreated:
downloadImage(inContext);
Debug.WriteLine("dir item created");
break;
default:
Debug.WriteLine(String.Format("ObjectEventHandler: event {0}", inEvent));
break;
}
return 0;
}
我尝试了多种方法(检索此图像)它们似乎都没有效果。 一些方法是:
http://tech.groups.yahoo.com/group/CanonSDK/message/1575
[http://stackoverflow.com/questions/3762530/take-picture-and-directly-save-image-to-pc-using-edsdk-2-8]
[http://canonsdk.com/phpBB3/viewtopic.php?f=7&t=94&sid=7fcbe7ad6eadb399dbcb4b61a7333112]
事情就是所有这些都只是代码的一部分,当我试图把它放在我的代码中时,它永远不会有效 正确的。因为我不是memoryStreams的专家,指针就是这样。 我得到的大多数错误是在读取流并将它们复制到本地缓冲区时,它说流是空的。
是否有人拥有拍摄照片并将其下载到磁盘(或内存)的完整示例代码,或者我需要的完整方法才能完成此操作?
由于 费尔南多
答案 0 :(得分:1)
代码中的错误是:
downloadImage(inContext);
应该是
downloadImage(inRef);
答案 1 :(得分:0)
将捕获图像作为文件下载到硬盘中,您可以将其检出
void DownloadImage(IntPtr DirectoryRef)
{
IntPtr stream = IntPtr.Zero;
try
{
Error = EDSDK.EdsGetDirectoryItemInfo(DirectoryRef, out dirItemInfo);
if (Error == OK)
{
Error = EDSDK.EdsCreateFileStream(dirItemInfo.szFileName,
EDSDK.EdsFileCreateDisposition.CreateAlways, EDSDK.EdsAccess.ReadWrite, out stream);
}
if (Error == OK)
{
Error = EDSDK.EdsDownload(DirectoryRef, dirItemInfo.Size, stream);
}
if (Error == OK)
{
Error = EDSDK.EdsDownloadComplete(DirectoryRef);
}
else
{
Error = EDSDK.EdsDownloadCancel(DirectoryRef);
}
Error = EDSDK.EdsGetPointer(stream, out data);
if (Error != OK)
throw new Exception("Invalid Pointer Handler. Error Code:" + err.getErrorName(Error) + "(" + Error + ")" );
Error = EDSDK.EdsGetLength(stream, out size);
Bitmap retImage = null;
}
catch (Exception ex)
{
}
EDSDK.EdsRelease(stream);
EDSDK.EdsRelease(data);
}