如何在c#中将字符串大小转换为英寸

本文关键字:转换 字符串 | 更新日期: 2023-09-27 18:01:16

我想知道字符串的打印尺寸,以英寸为单位。即,当打印在纸上时,字符串"Test string"的长度(和宽度)是多少?我可以使用Graphics对象和MeasureString方法获得以像素为单位的长度。但是不知道如何在纸上把像素转换成英寸。

我检查了这个SO问题,但是找不到解决方法。

如何在c#中将字符串大小转换为英寸

数字图形的分辨率是其像素尺寸。打印图形的尺寸取决于打印机设置。

  • 如果您在打印机上打印300 x 300 pixels300dpi的图片图片变为1 x 1 inch. (300/300)

  • 如果您在打印机上打印300 x 300 pixels10dpi的图片图片变成30 x 30英寸。(300/10)

  • 如果您在打印机上打印300 x 300 pixels1000dpi的图片图片变为0,3 x 0,3 inch. (300/1000)

然而,确切的尺寸取决于打印机的精度(送纸,打印机头伺服等)

在这里找到一个很好的参考:DPI与数字图像质量无关!

显示的Dpi与此无关

我知道这是一个老问题,但这是一个合适的解决方案。我已经测试了我的解决方案几次,它似乎是准确的,但不精确。此代码的基础直接来自MSDN示例和SO的答案,我所做的唯一不同的事情是将单位从点更改为英寸。

MSDN Graphics.MeasureString ()

private float GetTextWidth(string fontFace, float fontSize, string text)
{
    SizeF size = new SizeF();
    Font font = new Font(fontFace, fontSize);
    //Using a Bitmap object for frame of reference in order to get to a Graphics object
    using (Bitmap b = new Bitmap(1, 1))
    {
        //Graphics object allows string measurement
        using (Graphics g = Graphics.FromImage(b))
        {
            //change the units to inches
            g.PageUnit = GraphicsUnit.Inch;
            //Perform the measurement
            size = g.MeasureString(text, font);
        }
    }
    //Print to console if you want 
    //Console.WriteLine(size.Width);
    return size.Width;
}

我用以下输入进行了测试:("Arial", 10, "Page 1 of 1"),得到0.777972英寸

如果你读了上面的MSDN链接的备注,你会发现在那个数字上有一点额外的空格。你必须意识到这会发生:

MeasureString方法是为单独的字符串设计的并在字符串前后包含少量额外的空间允许突出的字形。

当我在一张纸上测量这个时,我得到了大约0.625,这是0.152972的差异,基本上是~20%的填充。我猜它均匀地分布在两边。

还要注意你使用的字体——例如Helvetica不是默认支持的字体,因此如果font对象找不到你的字体,它将默认为Arial。

这是不可能的,除非您知道打印机尺寸和显示尺寸的硬数字。

假设你正在打印一份全屏讲义。在30英寸的显示器上,1个像素在纸上可能是1个单位大。但是在7英寸的上网本上,一个像素在纸上是2个单位大——是纸上的两倍大,尽管它们在电子显示器上都是一个像素。

简单地说,这种测量是不可能的,除非你正在使用固定的东西,比如iPhone的显示尺寸(这是众所周知的),或者你自己的硬件,其屏幕尺寸你有精确的测量。