1

EDSDK を使用してデジタル カメラと PC を接続するアプリを C# で作成しています。ユーザーが写真を撮ります。ソフトウェアでイベントをトリガーします。次に、ソフトウェアはイメージの新しいイメージを PC にコピーします。それはうまくいっています。

今は、PC が利用できない場合や、カメラが何らかの理由で PC との接続を失った場合に、ソフトウェアが適切に処理できるようにしたいと考えています。そのため、ユーザーがソフトウェアで新しいセッションを開始するたびに、まずカメラに画像があるかどうかを確認し、ある場合はローカルにコピーします。そのためには、個々のディレクトリ項目へのポインターを取得する方法が必要です。これまでのところ、これを行う方法についてドキュメントやオンラインで何も見つけることができませんでした。

EDSDK がカメラから既存のファイルのリストを取得する方法はありますか?

4

1 に答える 1

1

これを行うための関数を作成しました。これは、純粋に SDK を自分自身に教えるためです。そのため、コードは本番環境では使用されていないため、関連する機能を提供します。

       /// <summary>
    /// Gets a list of files on the CF Card. If dest is given, downloads them
    /// </summary>
    /// <param name="dest">string.empty if you just want a list of file names, otherwise the folder in which you want the files</param>
    /// <returns>a list of file names</returns>
    public  List<string> GetPicturesOnCard(string dest)
    {
        IntPtr volumeRef = IntPtr.Zero;
        IntPtr dirRef = IntPtr.Zero;
        IntPtr subDirRef = IntPtr.Zero;
        List<string> result = new List<string>();
        try
        {
            openSession();
            int nFiles;
            if (EDSDK.EdsGetChildAtIndex(camera, 0, out volumeRef) != EDSDK.EDS_ERR_OK)
                throw new CannonException("Couldn't access Memory Card");
            //first child is DCIM
            if (EDSDK.EdsGetChildAtIndex(volumeRef, 0, out dirRef) != EDSDK.EDS_ERR_OK)
                throw new CannonException("Memory Card formatting Error");
           //first child of DCIM has the actual photos
            if(EDSDK.EdsGetChildAtIndex(dirRef, 0, out subDirRef)!= EDSDK.EDS_ERR_OK)
                throw new CannonException("Memory Card formatting Error");
            EDSDK.EdsGetChildCount(subDirRef, out nFiles);  
            for (int i = 0; i < nFiles; i++)
            {      

                IntPtr fileRef = IntPtr.Zero;
                EDSDK.EdsDirectoryItemInfo fileInfo;
                try
                {
                    EDSDK.EdsGetChildAtIndex(subDirRef, i, out fileRef);
                    EDSDK.EdsGetDirectoryItemInfo(fileRef, out fileInfo);
                    if (dest != string.Empty)
                    {
                        IntPtr fStream = IntPtr.Zero;//it's a cannon sdk file stream, not a managed stream
                        uint fSize = fileInfo.Size;
                        try
                        {
                            EDSDK.EdsCreateMemoryStream(fSize, out fStream);
                            if (EDSDK.EdsDownload(fileRef, fSize, fStream) != EDSDK.EDS_ERR_OK)
                                throw new CannonException("Image Download failed");
                            if (EDSDK.EdsDownloadComplete(fileRef) != EDSDK.EDS_ERR_OK)
                                throw new CannonException("Image Download failed to complete");
                            byte[] buffer = new byte[fSize];
                            IntPtr imgLocation;
                            if (EDSDK.EdsGetPointer(fStream, out imgLocation) == EDSDK.EDS_ERR_OK)
                            {
                                Marshal.Copy(imgLocation, buffer, 0, (int)fSize - 1);
                                File.WriteAllBytes(dest + fileInfo.szFileName, buffer);
                            }
                            else
                                throw new CannonException("Interal Error #1");//because the expection text coud land up in a message box some where
                        }
                        finally
                        {
                            EDSDK.EdsRelease(fStream);
                        }
                    }
                }
                finally
                {
                    EDSDK.EdsRelease(fileRef);
                }
                result.Add(fileInfo.szFileName);
            }

        }
        finally
        {
            EDSDK.EdsRelease(subDirRef);
            EDSDK.EdsRelease(dirRef);
            EDSDK.EdsRelease(volumeRef);
            closeSession();
        }

        return result;
    }

実際には、SDK を初期化し、次にカメラを初期化し、セッションを開きます。それが完了したら、カードへの参照を取得し、次にフォルダー(必要なフォルダーは最初の子の最初の子です)を取得し、そこにあるすべての子を反復処理します-それらはファイルです。

SDK のドキュメントは読むのが楽しくありませんが、私が見逃した部分を教えてくれます (カメラの初期化の方法など。プロジェクトの残りの部分から方法を知っていると仮定しています)。

于 2012-05-25T13:55:22.763 に答える