首页 > 解决方案 > 如何使用 C# 找到通过 USB 电缆连接的相机,然后我可以复制存储的图像

问题描述

我想通过 USB 电缆将相机连接到计算机,并将图像从相机的 SD 卡复制到计算机。我找不到图像。我想检测任何相机,而不仅仅是佳能……但我需要先解决佳能。(从相机中取出 SD 卡不是一个可用的解决方案。)

使用 USB 电缆将相机连接到计算机时,相机会显示在“此 PC”文件夹下。但是“这台电脑”不是一个普通的文件夹,而是一个特殊的文件夹,它不会出现在任何正常路径下。Windows 显然使用“::{20D04FE0-3AEA-1069-A2D8-08002B30309D}”在内部访问它,但我无法在 C# 中使用它。指向它的环境变量返回“”,并记录为这样。我尝试使用 DriveInfo.GetDrives() 列出所有磁盘驱动器。但是相机没有出现......显然它只是一个设备而不是驱动器(即使当你点击它时你会看到一个文件夹视图)。

我能找到的访问佳能相机图像的唯一参考资料都使用佳能 SDK,该 SDK 仅适用于他们的 EOS 型号相机以提供完整的远程控制。

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

目的: 我正在尝试为一位年长的朋友制作一个程序,以便他可以轻松地将照片下载到他的计算机上。他知道如何使用 USB 电缆连接相机,但打开文件夹、复制、拖放等让他感到困惑。它必须是全自动的...连接相机和C#程序将所有图片和视频复制到计算机硬盘驱动器,然后打开“Windows资源管理器”到硬盘驱动器上的目标文件夹。直接访问 SD 卡(将其从相机中移除)不是一种选择,因为我的朋友有身体限制,这会阻止它。

标签: c#windowscamerausb

解决方案


使用此脚本和来自“Ralf Beckers”的 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();
            }
        }

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

感谢“@ZackOfAllTrades”让我注意到这个 nuget 数据包


推荐阅读