从Windows C# Canon SDK、PTP或MTP中拍摄照片

8

我希望能够获得一些关于实现一个看似简单的目标的通用指导。我有一台数码单反相机(佳能EOS 50D),需要编写一个应用程序,告诉相机拍摄照片。我还需要将照片传输到计算机,并可能从相机存储中删除它。如果能在我的应用程序中获得来自相机的实时预览,那就更好了。我的环境将是Windows(XP Pro或Vista Enterprise)和.Net 3.5(C#)。

我已经做了一些研究,并找到了几个选项。其中一个我知道会起作用,但限制我只能在将来使用佳能相机。我已经找到并下载了一个来自佳能的SDK,提供了很多这方面的功能。我已经查看了SDK,虽然它非常广泛且使用C编写,但它确实有C#包装器,可以加快开发速度。

我找到的另一个选项称为“Windows便携式设备”。显然,这是一个API,可以与实现PTP和MTP标准的设备进行通信。它基于COM,据我所知,它没有任何.Net包装器。不过,这并不是阻碍开发的问题。我可以P/Invoke所需的功能,或编写一个托管的C++ DLL,在我的应用程序中使用它来与相机交互。

我正在寻找有WPD经验的人给我指点。我已经浏览了文档,并看到了有关传输图像和删除图像的引用。但是,我没有看到拍照、获取预览图像或对焦/自动对焦等命令的提及。


我对看到这个问题的答案很感兴趣。就我个人而言,如果我只是为自己编写应用程序,我会首先尝试使用佳能软件开发工具包(SDK)。此外,如果你已经有了一组佳能镜头,未来你可能会继续使用佳能品牌 :-). - Ben McCormack
1
这听起来会是一个很棒的 CodePlex 项目。我有一台 Rebel XTi 相机,这听起来像是一个有趣的概念可以去尝试。如果你决定开始一个 CodePlex 项目,请务必告诉我! - Ben McCormack
C++/CLI封装Canon SDK的工作正在继续进行中,这是一个真正的挑战。我认为我无法发布CodePlex项目,因为我没有代码的权利。很抱歉。我希望在这方面有更多的自由度。 - Nate
希望我能做到。那段代码已经被我的前雇主知识产权所包含,已经过去很长时间了。最终我使用了佳能SDK,并用C# P/Invoke类封装了C代码。这是相当具有挑战性的。佳能SDK非常晦涩难懂,而且在我看来与MTP直接耦合度太高。我真正想要的是一个库,只需说“拍照”或“给我实时屏幕预览”。当时很难找到这样的库。自那以后,我了解到Linux上有一个可以做到这一点的库,但我没有使用过,也不知道它的名字。 - Nate
5个回答

3

WPD API提供了WPD_COMMAND_STILL_IMAGE_CAPTURE_INITIATE命令。

我不确定您的相机是否支持它,但应该很容易找出。如果您可以从驱动程序开发工具包中获取“wpdinfo”工具,并使用连接的相机启动它,然后发送一个WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_COMMANDS命令并查看它是否支持静态图像捕获命令。如果是,则可以尝试使用它。


谢谢!这正是我在寻找的。尚未尝试,但一旦有机会就会尝试。目前我正在使用佳能SDK。它有些问题,更不用说它只能与佳能EOS相机配合使用了... - Nate
我最终尝试了这个。不幸的是,它不支持我的EOS 50D相机。如果我有另一个相机可以尝试,我会再试一次。我通过WPD博客给微软WPD开发人员发送了电子邮件,要求提供支持各种WPD命令的制造商列表,但他们没有这样的列表。然而,在弄清楚如何使用WPD方面,他们非常乐于助人。 - Nate

3
"TallGanglyGuy的评论是错误的。PTP确实允许您触发新图像并更改曝光等设置。一些相机具有仅公开某些ptp命令的固件。" "PTP支持常见设备控制,例如拍照,以便用户可以在不需要额外软件的情况下利用PC/相机组合进行新的和不同的操作。" "摘自http://msdn.microsoft.com/en-us/windows/hardware/gg463507.aspx#EXC"

2

1

PTP和MTP都是从数码相机(DSC)传输文件的协议。这些协议不提供触发新图像或设置曝光控制的功能。您将需要使用特定于相机的SDK。如果您想要多个供应商支持,尼康有一个SDK,为他们的相机提供类似于佳能SDK的支持。

有关PTP和MTP的更多信息,请参见此处: http://en.wikipedia.org/wiki/Picture_Transfer_Protocolhttp://en.wikipedia.org/wiki/Media_Transfer_Protocol

编辑

我忘了提到,假设您的相机驱动程序提供WIA接口,则WIA可能会对您有所帮助。


我查看了WIA,它已被Windows便携设备所取代。虽然我不确定PTP或MTP是否包括此功能(拍照),但我在WPD中看到了一些信息,暗示它可能有这个功能。无论如何,WPD应该可以做到(见下文),这是我考虑在此应用程序中使用的内容。我后来决定使用SDK,并可能在以后探索WPD。“建立在WPD上的应用程序可以探索设备,发送和接收内容,甚至控制设备,例如,拍照...”http://msdn.microsoft.com/en-us/library/dd388998%28VS.85%29.aspx - Nate

0

这个方法可能有点通用,但是它可能会有所帮助。

我曾经写过一个应用程序,使用了两个不同供应商的不同SDK的条形码扫描仪。我创建了一个接口,定义了我想要编写的方法和事件,然后编写了适配器类来实现我的接口。

在我的情况下,这种方法效果很好,而且从一个扫描仪切换到另一个扫描仪也非常顺畅。如果你采用同样的方法,你就不会完全依赖于一个SDK。


是的,接口是必须的。我可以轻松地创建一个带有通用方法并根据需要实现的基类或接口。虽然这很有用,但是拥有一个适用于许多相机品牌的单个SDK会更省事。谢谢。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接