Сделайте снимок использования прямоугольника в WP7

Я работаю над приложением 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;    
}

Вот изображение, на котором я хочу отобразить миниатюру в графическом интерфейсе.

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

person user473104    schedule 17.04.2012    source источник


Ответы (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, он остается пустым (как будто у него нет фона).

person gbanfill    schedule 17.04.2012
comment
Извините - вводящие в заблуждение вещи, связанные с Invalidate(). Обновлен ответ, чтобы вместо этого использовать GetPreviewBufferArgb32(). - person gbanfill; 17.04.2012
comment
Что такое «с» в вашем примере? как в c.GetPreviewBufferArgb32(buf); Он не объявлен и не создан - person user473104; 17.04.2012
comment
Я обнаружил, что c — это тип PhotoCamera, но в моем случае я использую CaptureSource _captureSource. - person user473104; 17.04.2012
comment
MSDN говорит, что вы можете захватить кадр с помощью CaptureImageAsync (msdn.microsoft.com/en-us/library/). Извините, никогда не использовал это, я использовал только фотокамеру - person gbanfill; 17.04.2012