当我发布here时,我能够在WindowsForm 上显示一些特殊字体,但是却无法将该字体另存为图片。问题是Graphic.DrawString()无法显示所有或特殊字体。 WindowsForm使用TextRenderer及其更新的版本(添加2.0),这就是WindowsForm能够显示这些字体的原因。

美好的。现在我坐在这里,尝试用TextRenderer.DrawText()做同样的事情-我不得不说,我的输出图像现在​​更好,但是仍然与WindowsForm上的不一样。让我们看一下我的代码:

    Bitmap Bit = new Bitmap(500, 200);
    Graphics g = Graphics.FromImage(Bit);

    string s = "TEST";

    g.Clear(Color.White);
    TextRenderer.DrawText(g, s, new Font("Code 128", 72), new Point(20, 20), Color.Black, Color.White);
    Bit.Save(@"C:\myFolder\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    Bit.Dispose();

(代码128是一种特殊字体,如果您真的想了解更多有关该字体的信息,请单击下面的链接以获取更多信息)

这样就可以了,我的形象很好。现在,我在WindowsForm上的Label上,在同一VS Project上添加了具有相同字体的相同字符串。而且有一些区别。区别在于,使用TextRenderer创建的图像在第一个位置始终具有不同的字符。其他一切都很好!我不明白。让我们来看看WinForm VS Image:

如我们所见,第一个“字符”(如果在这个示例中可以说“字符”)是不一样的。现在,让我将TextRenderer Image函数中的字符串更改为“TTEST”。比较WinForm上的“TEST”与TextRenderer图像上的“TTEST”:

看起来很有趣吧?因此,TextRenderer.DrawText() +特殊字体=第一个字符很奇怪。但为什么?以及如何解决这个问题?有什么建议么?谢谢!

编辑:如果有帮助,我可以发布WindowsForm的代码
partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.label1 = new System.Windows.Forms.Label();
        this.SuspendLayout();
        //
        // label1
        //
        this.label1.AutoSize = true;
        this.label1.Font = new System.Drawing.Font("Code 128", 72F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2)));
        this.label1.Location = new System.Drawing.Point(30, 41);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(144, 94);
        this.label1.TabIndex = 0;
        this.label1.Text = "TEST";
        this.label1.Click += new System.EventHandler(this.label1_Click);
        //
        // Form1
        //
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.label1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.Label label1;
}

正如我们看到的一样,它的字体相同,字符串相同。我不明白...

最佳答案

您输入了错误的代码,这是位图版本已关闭。在我看来,就像一个UEST,一个明显的一一错误。

这不是唯一的问题,即使您要解决此问题,它仍然不是有效的Code128条码。您还需要此Wikipedia article中记录的Start,Check和Stop字符。您可能接近不可避免的“购买,不要 build ”的结论。查找生成条形码的控件并不困难也不昂贵。

10-04 21:37