将WPF画布渲染为特定大小的位图

时间:2012-12-03 20:13:06

标签: wpf scaling rendertargetbitmap

我有一个WPF Canvas,我想制作一个位图。

具体来说,我想在300dpi位图上渲染实际大小。 在现实生活中,画布上对象的“实际大小”为10 device independent pixels = 1“。 理论上,WPF设备无关的像素是96dpi。

我花了好几天时间试图让这个工作起来,并且陷入困境。

我的理解是,一般程序大致是:

var masterBitmap = new RenderTargetBitmap((int)(canvas.ActualWidth * ?SomeFactor?),
                                          (int)(canvas.ActualHeight * ?SomeFactor?),
                                          BitmapDpi, BitmapDpi, PixelFormats.Default);
masterBitmap.Render(canvas);  

并且我需要将画布的LayoutTransform设置为ScaleTransform?SomeOtherFactor?然后做一个测量并将画布排列到?SomeDesiredSize?

我坚持使用的是什么?SomeFactor?,?SomeOtherFactor?和?SomeDesiredSize?使这项工作。 MSDN documentation没有说明要使用哪些因素。

1 个答案:

答案 0 :(得分:0)

我使用此代码以1:1的像素精度显示图像。

double dpiXFactor, dpiYFactor;  
Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
if (m.M11 > 0 && m.M22 > 0)
{
    dpiXFactor = m.M11;
    dpiYFactor = m.M22;
}
else
{
    // Sometimes this can return a matrix with 0s.
    // Fall back to assuming normal DPI in this case.
    dpiXFactor = 1;
    dpiYFactor = 1;
}

double width = widthPixels / dpiXFactor;
double height = heightPixels / dpiYFactor;

不要忘记在控件上启用UseLayoutRounding。