如何使用C#查找通过USB电缆连接的相机,这样我便可以复制存储的图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用C#查找通过USB电缆连接的相机,这样我便可以复制存储的图像相关的知识,希望对你有一定的参考价值。

我想通过USB电缆将照相机连接到计算机,然后将图像从照相机的SD卡复制到计算机。我找不到图像。我想检测任何相机,而不仅仅是佳能...但是我需要先解决佳能。 (从相机中移除SD卡是not可用的解决方案。)

[使用USB电缆将照相机连接到计算机时,照相机显示在“ This PC”文件夹下。但是“此PC”不是普通文件夹,而是特殊文件夹,不会在任何普通路径下显示。 Windows显然在内部使用“ :: 20D04FE0-3AEA-1069-A2D8-08002B30309D”,但我找不到在C#中使用它的方法。指向它的环境变量将返回“”,并以此进行记录。我尝试使用DriveInfo.GetDrives()列出所有磁盘驱动器。但是,相机没有显示出来……显然,它只是一台设备,而不是驱动器(即使单击它也可以看到文件夹视图)。

我可以找到的唯一访问佳能相机图像的参考文献都使用佳能SDK,该佳能仅与其EOS型号相机配合使用以提供完全的遥控。

设备:使用Visual Studio 2019,C#,Windows 10 Pro和佳能PowerShot SX700 HS相机

目的:我正在尝试为一个老年朋友编写程序,以便他可以轻松地将照片下载到计算机上。他知道如何用USB电缆连接相机,但是打开文件夹,复制,拖放等会使他感到困惑。它必须是全部自动的。不能直接访问SD卡(将其从相机中删除),因为我的朋友有身体上的限制,无法使用它。

答案

使用此脚本和“劳尔·贝克斯”中的nuget包“ MediaDevices”,您可以在下面的脚本中像这样从相机复制所有文件。只需确保更改诸如“设备名称”,@“ \ Internal Storage \”以及我的桌面位置的内容即可:)“:

using System.IO;
using MediaDevices;

private void button3_Click(object sender, EventArgs e)
        
            var devices = MediaDevice.GetDevices();
            foreach(var device in devices)
            
                MessageBox.Show(device.FriendlyName);
                if (device.FriendlyName == "DEVICE NAME")
                
                    device.Connect();

                    var drs = device.GetFiles(@"\Internal Storage\");
                    foreach (string str in drs)
                    
                        MessageBox.Show(str);
                        MemoryStream memoryStream = new System.IO.MemoryStream();
                        device.DownloadFile(str, memoryStream);
                        memoryStream.Position = 0;
                        WriteStreamToDisk(@"C:\Users\nikla\Desktop\temp\" + str.Substring(str.LastIndexOf("\\") + 1), memoryStream);
                    

                
            

        

        static void WriteStreamToDisk(string filePath, MemoryStream memoryStream)
        
            using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write))
            
                byte[] bytes = new byte[memoryStream.Length];
                memoryStream.Read(bytes, 0, (int)memoryStream.Length);
                file.Write(bytes, 0, bytes.Length);
                memoryStream.Close();
            
        

您可以使用device.GetDirectories(@"\Internal Storage\")索引更多文件,并通过foreach循环遍历它们。

贷记“ @ZackOfAllTrades”,以引起我注意此nuget包

另一答案

[将相机(或智能手机)连接到计算机时,有两个结果:

  1. 相机的行为类似于USB记忆棒或其他大容量存储设备。那是理想的情况。
  2. 相机的行为不像USB记忆棒。 Wich表示您需要制造商的特殊程序才能访问图片。

如果是第一种情况,它实际上就像每个USB记忆棒一样工作。

如果是情况2,那么编程是唯一的方法。您与exactly提供的内容紧密相关。

个人而言,我永远不会购买这种情况下的2相机。虽然我很欣赏不希望普通用户删除他们不应该与之交互的文件夹的想法,但是确实需要一个特殊的程序非常麻烦。] >

以上是关于如何使用C#查找通过USB电缆连接的相机,这样我便可以复制存储的图像的主要内容,如果未能解决你的问题,请参考以下文章

ADB over TCP/IP 在没有连接 USB 电缆的情况下无法工作

ubuntu 下如何获取USB接口相机的uri路径

如何知道 iOS 设备是通过 USB 还是 Wall Port Charger 连接的?

循环使用 USB 电缆时,Android ADB-over-WiFi 仍会断开连接(?!?)

通过USB 2.0电缆手动设置内核模式调试

ni vision builder如何与工业相机连接?