我有一个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没有说明要使用哪些因素。
答案 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。