拍摄在WP7中使用矩形的快照

时间:2012-04-17 07:25:31

标签: c# .net windows-phone-7 bitmap writeablebitmap

我在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"/>

1 个答案:

答案 0 :(得分: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上设置了取景器画笔(我想我记得为什么我认为它是在那里完成的,但我认为是这样)。这意味着silverlight也无法访问原始视频,当您渲染silverlight元素时,它是空白的(就好像它没有背景)。