1

私はビデオを録画したい WP7 アプリで作業しており、ビデオを保存する前にビデオのスナップショットを作成して、サムネイル画像として使用できるようにします。サムネイル画像は、使用前に一時的に分離ストレージに保存されます。カメラの場合、長方形を使用してビデオを録画し、後で電話に写真を表示したいと考えています。問題は、画像が黒い画面しか表示されないことです。画像をメディア ライブラリに保存しようとしても、画像が黒く表示されます。この問題の原因と解決方法を教えてください。

以下のコードを挿入しました。

これは、ビデオをキャプチャする長方形です。

 <Rectangle 
            x:Name="viewfinderRectangle"
            Width="640" 
            Height="480" 
            HorizontalAlignment="Left" 
            Canvas.Left="80"/>

写真を撮るためのコードは次のとおりです。

try
            {
                String tempJPEG = FOSConstants.TEMP_VIDEO_THUMBNAIL_NAME;
                var myStore = IsolatedStorageFile.GetUserStoreForApplication();
                if (myStore.FileExists(tempJPEG))
                {
                    myStore.DeleteFile(tempJPEG);
                }
                IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempJPEG);

                WriteableBitmap wb = new WriteableBitmap(viewfinderRectangle, null);
                wb.SaveJpeg(myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                myFileStream.Close();

                myFileStream.Close();


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error saving snapshot", MessageBoxButton.OK);
            }

分離ストレージからサムネイル画像を読み取るコードは次のとおりです。

private BitmapImage GetIsolatedStorageFile(string isolatedStorageFileName)
{
        var bimg = new BitmapImage();
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {
           using (var stream = store.OpenFile(isolatedStorageFileName, FileMode.Open,                 FileAccess.Read))
            {  
                bimg.SetSource(stream);
            }
        }


return bimg;    
}

これは、GUI でサムネイルを表示したい画像です。

<Image Width="180" 
                       Height="180" 
                       Stretch="Fill"
                       Margin="24,0,0,0"
                       Source="{Binding Path=ImageSoruce, Mode=TwoWay}"
                       HorizontalAlignment="Left"/>
4

1 に答える 1

1

編集: Invalidate() に関する誤解を招くものを削除しました。それを行う必要はありません。

そのため、GetPreviewBufferArgb32() メソッドを使用して、カメラが現在提供しているものを取得できます。以下に示すように、これを書き込み可能なビットマップにコピーできます。

using (var myStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (myStore.FileExists(tempJPEG))
    {
        myStore.DeleteFile(tempJPEG);
    }

    IsolatedStorageFileStream file = myStore.CreateFile(tempJPEG);
    int[] buf = new int[(int)c.PreviewResolution.Width * (int)c.PreviewResolution.Height];
    c.GetPreviewBufferArgb32(buf);

    WriteableBitmap wb = new WriteableBitmap((int)c.PreviewResolution.Width, (int)c.PreviewResolution.Height);
    Array.Copy(buf, wb.Pixels, buf.Length);
    wb.SaveJpeg(file, (int)c.PreviewResolution.Width, (int)c.PreviewResolution.Height, 0, 100);
}

サンプル コードが機能しない理由は、ビューファインダー ブラシが GPU に設定されているためです (GPU で行われていると思う理由は覚えていると思いますが、そうであると思います)。つまり、Silverlight は生のビデオにアクセスできず、Silverlight 要素をレンダリングすると空白になります (背景がないかのように)。

于 2012-04-17T08:15:16.657 に答える