System.Drawing.Font以反映CSS字体

本文关键字:CSS 字体 Drawing Font System | 更新日期: 2023-09-27 18:21:06

我正在代码中创建一些文本图像,这些图像需要尽可能地反映CSS字体。CSS类如下所示:

.font
{
      letter-spacing: -0.7px;
      font-family: segoe wp,segoe ui,verdana,arial,helvetica,sans-serif;
      font-size: 1.15em;
      padding: 10px;
}

我的图像代码如下:

using (var helper = new Bitmap(1, 1))
using (var gHelper = Graphics.FromImage(helper))
using (var font = new Font("Segoe WP", 1.15f, GraphicsUnit.Point))
using (var brush = new SolidBrush(Color.White))
{
    var size = gHelper.MeasureString(concept, font);
    using (var image = new Bitmap((int)size.Width + _padding, (int)size.Height + _padding))
    {
        using (var g = Graphics.FromImage(image))
        {
            g.Clear(Color.Black);
            g.DrawString(concept, font, brush, (float)_padding / 2, (float)_padding / 2);
        }
        var converter = new ImageConverter();
        var b = (byte[])converter.ConvertTo(image, typeof(byte[]));
        return File(b, _contentType);
    }
}

此代码生成的图像非常小。

我猜字母间距需要我做一个循环并单独绘制每个字母,但我如何在C#中使用EM?

System.Drawing.Font以反映CSS字体

在我看来,您不能使用EM,因为它们不是固定的
阅读本部分(摘自http://webdesign.about.com/od/typemeasurements/qt/how-big-is-an-em.htm):

但是Em有多大
根据W3C的一个em:"等于它所在元素的"font-size"属性的计算值使用。当"em"出现在'font-size'属性本身,在这种情况下,它指的是字体大小父元素的。换句话说,ems没有绝对的大小他们根据自己的位置来确定自己的尺码值。对于大多数人网页设计师,这意味着他们在网页浏览器中,所以字体1米高的与的默认字体大小完全相同该浏览器。

但是默认尺寸有多高
没有办法100%确定,因为客户可以在浏览器中更改默认字体大小,但是既然大多数人不这么认为,你可以假设大多数浏览器都有默认字体大小为16px。所以大多数时候1em=16px。

所以你可以试试:

using (var font = new Font("Segoe WP", 16 * 1.15f, GraphicsUnit.Point))

从一开始就知道这只是一个近似值!!

using (var font = new Font("Segoe WP", 1.15f, GraphicsUnit.Point))

点!=Em.

IIRC,em只是默认字体的一个比例。

您的图形对象假设您正在以低分辨率绘制屏幕。创建一个新的图形对象并定义一个更合适的分辨率

Bitmap bmp = new Bitmap(2000, 500);
bmp.SetResolution(300, 300); 
Graphics g = Graphics.FromImage(bmp);
// render your text.

您也可以使用System.Drawing.TextRenderer,这样可以获得良好的结果。