Windows Phone 8.1 では RenderTargetBitmap クラスを使って画面をキャプチャすることができます。
例えばこんなコントロールを画面に貼っているとして、
<UserControl x:Class="App25.SampleImagePanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App25" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="256" d:DesignWidth="256"> <Grid Background="White"> <Image Source="Assets/daruyanagi.png" Width="256" Height="256" /> </Grid> </UserControl>
次のようなコードで画像として保存できるのですが...
private async Task SaveSampleImage(string fileName) { var rtBitmap = new RenderTargetBitmap(); await rtBitmap.RenderAsync(this.SampleImage, 256, 256); // UserControl を x:Name="SampleImage" としています var file = await ApplicationData.Current.LocalFolder .CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); using (var strem = await file.OpenAsync(FileAccessMode.ReadWrite)) { var pixelBuffer = await rtBitmap.GetPixelsAsync(); var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, strem); encoder.SetPixelData( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, (uint)rtBitmap.PixelWidth, (uint)rtBitmap.PixelHeight, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, pixelBuffer.ToArray()); await encoder.FlushAsync(); } }
なぜか保存したファイルが端末の解像度によって微妙に変わってしまいます。
RenderAsync メソッドでサイズを指定してみたりもしたのですが変化なしでした。
(たまたまなのかもしれませんが) Windows 8.1 では希望通りのサイズになったのに Windows Phone で思った通りのサイズにならないので困っています。