2012-04-15 8 views
3

私のcam_CaptureImageAvailableメソッドでBitMapImageを使用しようとすると無効なクロススレッドアクセスが発生しました。ディスパッチャを使用しようとしましたが、クローズドストリームエラーにアクセスできない、System.ObjectDisposedExceptionが未処理 無効なクロススレッドアクセス

Deployment.Current.Dispatcher.BeginInvoke(delegate() 
       { 
        var bitmapImage = new BitmapImage(); 
        bitmapImage.SetSource(e.ImageStream); 
        WriteableBitmap wb = new WriteableBitmap(bitmapImage); 
        IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication(); 
        using (IsolatedStorageFileStream myFileStream = myStore.CreateFile(fileName)) 
        { 
         wb.SaveJpeg(myFileStream, 10, 10, 0, 70);//compressing image 
        } 
       }); 

としてもこれを試し

// Informs when full resolution picture has been taken, saves to local media library and isolated storage. 
    void cam_CaptureImageAvailable(object sender, Microsoft.Devices.ContentReadyEventArgs e) 
    { 

     string fileName = folderName+"\\MyImage" + savedCounter + ".jpg"; 

     try 
     { // Write message to the UI thread. 
      Deployment.Current.Dispatcher.BeginInvoke(delegate() 
      { 
       txtDebug.Text = "Captured image available, saving picture ," + fileName; 
      }); 

      // Save picture to the library camera roll. 
      //library.SavePictureToCameraRoll(fileName, e.ImageStream); 


      // Write message to the UI thread. 
      Deployment.Current.Dispatcher.BeginInvoke(delegate() 
      { 
       //txtDebug.Text = "Picture has been saved."; 

      }); 

      // Set the position of the stream back to start 
      e.ImageStream.Seek(0, SeekOrigin.Begin); 


      // Save picture as JPEG to isolated storage. 
      using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write)) 
       { 

        // Initialize the buffer for 4KB disk pages. 
        byte[] readBuffer = new byte[4096]; 
        int bytesRead = -1; 

        // Copy the image to isolated storage. 
        while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0) 
        { 
         targetStream.Write(readBuffer, 0, bytesRead); 

        } 

       } 

       var bitmapImage = new BitmapImage(); 
       bitmapImage.SetSource(e.ImageStream); 
       WriteableBitmap wb = new WriteableBitmap(bitmapImage); 
       IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication(); 
       using (IsolatedStorageFileStream myFileStream = myStore.CreateFile(fileName)) 
       { 
        wb.SaveJpeg(myFileStream, 10, 10, 0, 70); 
       } 

      } 





     } 
     finally 
     { 
      // Close image stream 
      e.ImageStream.Close(); 
     } 

    } 

誰もが、私はそれを感謝し、本当に感謝私を助けることができます。

答えて

2

であるため、BitmapImageWriteableBitmapをUIスレッドに作成する必要があります。

ObjectDisposedExceptionエラーが発生するのは、ディスパッチャがリクエストを処理するときにイメージのストリームが既に閉じられているためです。

このコードをDispatcherの呼び出しに移動しようとしましたか?

e.ImageStream.Close(); 

ディスパッチャのコードはすぐますが、後の時点で実行されませんが、あなたはすでにストリームを閉じています。

のストリームをメモリに読み込んで問題を回避し、そのMemoryStreamBitmapImageに渡して問題を解決できます。

+0

私はメモリストリームを使用していますが、画像を撮るたびに最初の画像のみを取得しています。ここでコードは 'e.ImageStream.Seek(0、SeekOrigin.Begin)あなたの助けてくれてありがとうございました –

+0

よく見えますか?あなたのお手伝いをしてくれてありがとうございました。正確な問題は何ですか?例外? – thumbmunkeys

+0

私は画像を撮るたびに最初の画像を取得しています –

関連する問題