1

我正在使用 WPF 为我的 WinRT 应用程序生成平铺图像。我有一个转换为 PNG 的磁贴 UserControl 并且效果很好(确实如此,请不要告诉我其他情况)。WinRT 传递给我一个比例属性 100% (320x150)、140% (434x210) 和 180% (558x270),我用它来生成正确大小的图像。

当我想在我的磁贴中使用图像时。我在我的 tile UserControl 后面的代码中复制了 WinRT 的图像选择功能(您可以提供图像比例,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 回答