我在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"/>
答案 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元素时,它是空白的(就好像它没有背景)。