1

WinRT アプリのタイル イメージを生成するために WPF を使用しています。PNG に変換されたタイル UserControl があり、これはうまく機能します (それ以外の場合は教えてください)。WinRT は、正しいサイズの画像を生成するために使用するスケール プロパティ 100% (320x150)、140% (434x210)、および 180% (558x270) を渡します。

タイルに画像を使いたいとき。タイル UserControl のコード ビハインドで、WinRT の画像選択機能を複製しました (画像の 3 つのスケールを指定すると、WinRT アプリは自動的に正しいスケールを選択します)。そのため、縮尺に応じて、大きいまたは小さい画像ソースを選択します。ただし、大きな縮尺では、フォント サイズは同じサイズのままで、非常に小さく見えます。これは WinRT で発生することではないため、スケールに基づいてフォント サイズを変更する必要はないと思います。そのため、UserControl を PNG に変換するために使用しているコードであり、DPI に関係するものである必要があります。ここに私の変換コードがあります:

// I pass in 320x150 or 434x210 or 558x270 depending on the scale.
public static MemoryStream ToPng(
    this FrameworkElement frameworkElement, 
    double width, 
    double height)
{
    BitmapSource bitmapSource = ToBitmapSource(frameworkElement, width, height);

    PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();
    pngBitmapEncoder.Frames.Add(BitmapFrame.Create(bitmapSource));

    MemoryStream memoryStream = new MemoryStream();
    pngBitmapEncoder.Save(memoryStream);

    memoryStream.Position = 0;

    return memoryStream;
}

public static BitmapSource ToBitmapSource(
    this FrameworkElement frameworkElement, 
    double width, 
    double height)
{
    Size renderingSize = new Size(width, height);
    frameworkElement.Measure(renderingSize);
    Rect renderingRectangle = new Rect(new Point(0, 0), renderingSize);
    frameworkElement.Arrange(renderingRectangle);
    frameworkElement.UpdateLayout();

    Rect bounds = VisualTreeHelper.GetDescendantBounds(frameworkElement);
    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
        (int)frameworkElement.ActualWidth,
        (int)frameworkElement.ActualHeight,
        96,
        96,
        PixelFormats.Pbgra32);

    DrawingVisual drawingVisual = new DrawingVisual();

    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        VisualBrush visualBrush = new VisualBrush(frameworkElement);
        drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), bounds.Size));
    }

    renderBitmap.Render(drawingVisual);

    return renderBitmap;
}

助けてくれてありがとう。とても有難い。

4

1 に答える 1

1

上記のコードを変更して、frameworkElement を 310x150 として測定および配置する必要がありました。次に、558x270 などの最終的な縮尺サイズにレンダリングし、DPI を (96/100)*scale に設定します。この場合、縮尺は 180 です。

于 2012-09-08T13:13:51.590 に答える