読者です 読者をやめる 読者になる 読者になる

kazuakix の日記

Windows Phone とか好きです

Windows Phone 8.1 の RenderTargetBitmap で思い通りの画像サイズにならない話

Windows Phone 8.1 では RenderTargetBitmap クラスを使って画面をキャプチャすることができます。
 
例えばこんなコントロールを画面に貼っているとして、

f:id:kazuakix:20141122235828j:plain,w360

<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();
    }
}

 
なぜか保存したファイルが端末の解像度によって微妙に変わってしまいます。

f:id:kazuakix:20141123000702j:plain

RenderAsync メソッドでサイズを指定してみたりもしたのですが変化なしでした。

(たまたまなのかもしれませんが) Windows 8.1 では希望通りのサイズになったのに Windows Phone で思った通りのサイズにならないので困っています。