C# 用于绘图应用程序的RenderTargetBitmap DPI

C# 用于绘图应用程序的RenderTargetBitmap DPI,c#,wpf,graphics,drawing,C#,Wpf,Graphics,Drawing,我一直在使用RenderTargetBitmap为我的应用程序绘制线条,如图所示 它起作用了,但我不太理解DPI。如果我需要在鼠标下画线,我会使用96的DPI。我需要知道的是,这是否适用于所有设备和屏幕,如果不适用,如何找到正确的设备和屏幕。DPI用于渲染非矢量图像。您不必担心更改不同显示器或由操作系统和显示器硬件决定的屏幕的DPI。你需要考虑的是你想要在图像中像素化的水平。一般来说,100x100像素以下的小图像应该可以使用96 DPI,100x100和300x300之间的任何图像都应该使用1

我一直在使用RenderTargetBitmap为我的应用程序绘制线条,如图所示


它起作用了,但我不太理解DPI。如果我需要在鼠标下画线,我会使用96的DPI。我需要知道的是,这是否适用于所有设备和屏幕,如果不适用,如何找到正确的设备和屏幕。

DPI用于渲染非矢量图像。您不必担心更改不同显示器或由操作系统和显示器硬件决定的屏幕的DPI。你需要考虑的是你想要在图像中像素化的水平。一般来说,100x100像素以下的小图像应该可以使用96 DPI,100x100和300x300之间的任何图像都应该使用150-175 DPI。对于大于300的任何内容,您可以使用300-400 DPI。过了一段时间,这就太过分了。大多数商业打印都是在350 DPI以下完成的,除非您进行随机打印。如果您绘制的线条笔划为1-3,您应该可以使用96 DPI,任何更大的,我建议使用150 DPI。

这是我用来获取系统DPI的代码:

// Get system DPI
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;
}
这将是系统正常DPI(96)的系数。系统的水平DPI为dpiXFactor*96,垂直DPI为dpiYFactor*96。您可以在Windows 7上测试这一点,方法是转到“开始菜单->“dpi”,然后选择“使文本和其他项目变大或变小”。100%表示系数为1,DPI为96。125%表示系数为1.25,DPI为120。150%表示系数为1.5,DPI为144


回退逻辑是由于客户崩溃报告造成的,我认为这可能是由变换矩阵全为零造成的。可能有更可靠的方法获取系统DPI(可能是pinvoke?),但我不知道。您使用的DPI取决于将对输出执行的操作。如果只在屏幕上查看图形而不进行缩放,则可以使用96dpi,而不必再担心。如果需要放大图形,则更高的分辨率可以提供更好的用户体验。如果打印图形是用户体验的重要组成部分,那么使用300dpi可能会更好。

看起来他使用的是
可写位图
,可能需要将WPF鼠标位置转换为位图上的像素位置。