可能使用DPI复制WPF中的WinRT像素密度更改

时间:2012-09-08 12:14:54

标签: c# .net wpf windows-runtime screen-resolution

我正在使用WPF为我的WinRT应用生成平铺图像。我有一个瓷砖UserControl转换为PNG,这很好用(它确实,请不要告诉我)。 WinRT向我传递了100%(320x150),140%(434x210)和180%(558x270)的比例属性,我用它来生成正确尺寸的图像。

当我想在我的瓷砖中使用图像时。我已经复制了WinRT的图像选择功能(你可以提供你的图像比例和WinRT应用程序自动选择正确的比例)在我的瓷砖UserControl的代码背后。因此,根据比例,我选择更大或更小的图像源。但是,在较大的尺度上,我的字体大小保持相同的大小,看起来非常小。我不认为我需要根据比例改变字体大小,因为这不是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;
}

感谢您的帮助。非常感谢。

1 个答案:

答案 0 :(得分:1)

我需要更改上面的代码,以便我测量并将frameworkElement排列为310x150。然后我将其渲染到最终比例大小,例如558x270并将DPI设置为(96/100)*刻度,在这种情况下刻度为180。