我正在使用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;
}
感谢您的帮助。非常感谢。
答案 0 :(得分:1)
我需要更改上面的代码,以便我测量并将frameworkElement排列为310x150。然后我将其渲染到最终比例大小,例如558x270并将DPI设置为(96/100)*刻度,在这种情况下刻度为180。