В этой статье я постараюсь по-простому объяснить, как программно можно сделать скриншот.

Существует возможность сделать скриншот любого контрола, в том числе и всей страницы. Давайте посмотрим на шаги, которые нам нужно предпринять в этой ситуации.

У нас есть простенькая страничка с логотипом iDev.by. Вот как она выглядит.

Делаем скриншоты на WP7

Исходный код страницы:


<Grid x:Name="LayoutRoot" Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel x:Name="TitlePanel"
Grid.Row="0"
Margin="12,17,0,28">
<TextBlock x:Name="PageTitle"
Text="wp screenshot"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<Grid x:Name="ContentPanel"
Background="White"
Grid.Row="1"
Margin="12,0,12,0">
<Image Source="logofull.png"
Name="ContentImage"/>
<Button Name="ScreenShotButton"
Grid.Row="2"
Foreground="Black"
Content="Make screen shot"
VerticalAlignment="Bottom"
Click="OnButtonClick"/>
</Grid>
</Grid>

Создадим объект WriteableBitmap. Это модифицируемый набор пикселей, в который мы и «положим» наш скриншот. При его создании все байты равны нулю.

Создаём мы его следующим образом:


var writeableBitmap = new WriteableBitmap(Convert.ToInt32(ActualWidth), Convert.ToInt32(ActualHeight));

Здесь параметры ActualWidth и ActualHeight – это реальный размеры нашей страницы (в случае, если вы захотите сделать скриншот отдельного контрола, нужно передавать его реальные размеры). Сейчас, наш пустой объект не представляет собой ничего, кроме чёрного прямоугольника.

Теперь вызовем у этого объекта метод Render, который в качестве параметра принимает в себя объект-источник (в нашем случае, это наша страница) и объект трансформации (тип System.Windows.Media.Transform, в нашем случае это null, потому что нам для скриншота трансформация будет явно лишней). В этом методе мы заполняем все пиксели нашего WriteableBitmap нужными пикселями всей нашей страницы.


writeableBitmap.Render(this, null);

Далее вызывается метод Invalidate. Этот метод сообщает нашему объекту о том, что ему нужно перерисоваться.


writeableBitmap.Invalidate();

После вызова этого метода, наш объект готов выступить в качестве источника для объекта типа Image, другими словами, мы сможем увидеть его на экране. Добавим ещё немного кода и можем смело смотреть, что у нас в итоге получилось:


ContentImage.Stretch = Stretch.Fill;
ContentImage.Source = writeableBitmap;
PageTitle.Text = "result:";
ScreenShotButton.Visibility = Visibility.Collapsed;
LayoutRoot.Background = new SolidColorBrush(Colors.Red);

Делаем скриншоты на WP7

Теперь наша задача состоит в том, чтобы сохранить наше изображение в формате JPEG. Для этого нужно создать MemoryStream, в который и будет записано наше изображение, и вызвать extension-метод SaveJpeg.


writeableBitmap.SaveJpeg(memoryStream, writeableBitmap.PixelWidth,
writeableBitmap.PixelHeight, 0, 100);
memoryStream.Seek(0, SeekOrigin.Begin);

Всё. Теперь мы готовы сохранять изображение в нашем телефоне. Для этого необходимо создать объект типа MediaLibrary, которая находится в пространстве имён Microsoft.Xna.Framework.Media (необходимо подключать библиотеку Microsoft.Xna.Framework) и вызвать у него метод SavePicture, куда передаётся имя файла и MemoryStream.


var mediaLibrary = new MediaLibrary();
mediaLibrary.SavePicture("wp7 screnshot", memoryStream);

Теперь давайте сделаем наш код немного более безопасным, и сохраним нашу картинку в галерею телефона.


private void OnButtonClick(object sender, RoutedEventArgs e)
{
var writeableBitmap = new WriteableBitmap(Convert.ToInt32(ActualWidth), Convert.ToInt32(ActualHeight));
writeableBitmap.Render(this, null);
writeableBitmap.Invalidate();
ContentImage.Stretch = Stretch.Fill;
ContentImage.Source = writeableBitmap;
PageTitle.Text = "result:";
ScreenShotButton.Visibility = Visibility.Collapsed;
LayoutRoot.Background = new SolidColorBrush(Colors.Red);
try
{
using (var memoryStream = new MemoryStream())
{
writeableBitmap.SaveJpeg(memoryStream, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 100);
memoryStream.Seek(0, SeekOrigin.Begin);
var mediaLibrary = new MediaLibrary();
mediaLibrary.SavePicture("wp7 screnshot", memoryStream);
}
MessageBox.Show("Screenshot was saved in your Pictures.");
}
catch (Exception)
{
MessageBox.Show("An exception has occured during saving the picture.");
}
}

Делаем скриншоты на WP7

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован.