0

10秒ごとに言う画像をキャプチャしたい。このために、次のコードを実行する Timer クラスを使用します。

 async private void captureImage()
    {
        capturePreview.Source = captureManager;
        await captureManager.StartPreviewAsync();

        ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();


        // create storage file in local app storage
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
            "TestPhoto.jpg",
            CreationCollisionOption.GenerateUniqueName);


        // take photo
        await captureManager.CapturePhotoToStorageFileAsync(imgFormat, file);

        // Get photo as a BitmapImage
        BitmapImage bmpImage = new BitmapImage(new Uri(file.Path));

        // imagePreivew is a <Image> object defined in XAML
        imagePreivew.Source = bmpImage;


        await captureManager.StopPreviewAsync();    
        //send file to server
        sendHttpReq();

         await file.DeleteAsync(StorageDeleteOption.PermanentDelete); 


    }

現在、ボタンクリックで上記の関数を呼び出していますが、

画像をWebサーバーに送信するため、画像が転送されたらファイルを削除したい。ただし、ボタンのクリック時に imagePreivew が更新されることはありませんが、ファイルを削除しないと、ボタンを押すたびに imagePreivew が変更されます。また、 CreationCollisionOption.ReplaceExisting を試しましたが、それでも同じ問題に直面しました。タイマーがタスクを実行するたびに新しいファイルを作成すると、多くのメモリが浪費されます。ファイルを削除するにはどうすればよいですか???

4

1 に答える 1

0

問題は、イメージがロードされる前に削除されていることです (ビットマップは非同期にロードされます)。

それを解決するには、置き換えるだけです。

    // Get photo as a BitmapImage
    BitmapImage bmpImage = new BitmapImage(new Uri(file.Path));

    using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
        {
            BitmapImage bmpImage = new BitmapImage();
            await bmpImage.SetSourceAsync(fileStream);
        }

このように、画像の読み込みが完了するのを待ってから削除します。

また sendHttpReq();、リクエストをサーバーに送信する前に画像も削除されるため、待機する必要があります。

もう 1 つ修正が必要な点は、前のキャプチャが完了していないときに、captureImage の 2 回目の呼び出しが発生する可能性があることです。これを修正するには、IsStillCapturing フラグを使用してまだキャプチャしている場合に戻るか、AsyncLock を使用して 2 つのCapturePhotoToStorageFileAsyncを同時に防ぐことができます。

于 2013-09-20T17:07:15.117 に答える