在.NET中打印 - 从毫米到像素的转换

hit*_*tzi 5 c# printing

如何将用户输入从毫米转换为像素,以便将其打印在页面的正确位置?

我使用以下代码:

private void document_PrintPage(object sender, PrintPageEventArgs e)
{
    float dpiX = e.Graphics.DpiX;
    float dpiY = e.Graphics.DpiY;
    Point p = new Point(mmToPixel(float.Parse(edtBorderLeft.Text), dpiX), 
            mmToPixel(float.Parse(edtBorderTop.Text), dpiY));
    e.Graphics.DrawImage(testImage, p);

}

private int mmToPixel(float mm, float dpi)
{
    return (int)Math.Round((mm / 25.4)  * dpi);
}
Run Code Online (Sandbox Code Playgroud)

edtBorderLeft.Text的值为"9.5",edtBorderTop.Text的值为"21,5".这些值是毫米.如果我用这段代码检查输出:

    private void printPage()
    {
        PrintDialog dialog = new PrintDialog();
        dialog.Document = document;
        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            PrintPreviewDialog preview = new PrintPreviewDialog();
            preview.Document = document;
            preview.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            preview.Show();
            //document.Print();
        }            
    }
Run Code Online (Sandbox Code Playgroud)

它几乎在页面中央显示图像.一个计算示例:

mmToPixel(float.Parse(edtBorderLeft.Text),dpiX)edtBorderLeft.Text ="9.5"dpiX = 600; 返回:224

如何计算打印图像的正确点?

hit*_*tzi 6

我找到了解决方案.您可以使用以下代码更改页面单位.所以我不需要转换:

 e.Graphics.PageUnit = GraphicsUnit.Millimeter;
Run Code Online (Sandbox Code Playgroud)

要么

e.Graphics.PageUnit = GraphicsUnit.Pixel;
Run Code Online (Sandbox Code Playgroud)

我可以使用上面的代码.


小智 5

只是添加一些解释。默认情况下,Graphics.PageUhit设置为“显示”。对于屏幕显示,这通常意味着每英寸96像素,对于打印机,这意味着每英寸100点。此信息埋在MSDN中,但是很难找到。

因此,对于打印机,您可以假定值为100,而不是使用dpiX / dpiY,但是将单位设置为毫米可能更安全。