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();,否则在您将请求发送到服务器之前,图像也会被删除。

您可能想要更正的另一件事是,在前一次捕获未完成时,可能会再次调用 captureImage。要解决这个问题,您可以使用 IsStillCapturing 标志并在它仍在捕获时返回,或者使用AsyncLock来防止同时发生两个 CapturePhotoToStorageFileAsync。

于 2013-09-20T17:07:15.117 回答