当前位置:编程学习 > C#/ASP.NET >>

如何将TrueType字体(矢量字体)转换成点阵字体? c#+matlab实现版


c# ,Form1.Designer.cs 核心部分:

       private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);          //adjusted
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(642, 623);                  //adjusted
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;     // 将窗口的关闭钮屏蔽为了显示干净
            this.Name = "Form1";
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;    //modified
            this.Text = "Form1";
            this.TopMost = true;
            this.Load += new System.EventHandler(this.Form1_Load);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
            this.Click += new System.EventHandler(this.Form1_Click);
            this.ResumeLayout(false);

        }

Form1.cs完全代码,注意注释里说明了部分操作是在matlab中进行的:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;                              //用户写bmp文件
namespace DotFont
{
    /*---------------------------------------------------------------------
     * 利用c#.net,matlab实现矢量字转换成点阵字,适用于unicode.
     * Author: chenhai GS0721526 北航
     * 本程序实现从unicode编码的内码(16位的二进制),结合windows的truetype字体,将字体点阵写入一个bmp文件,这个文件名以内码来索引。
     * 本人当时做的目的,是希望在matlab 2007a中使用这个bmp做汉字的模式识别。所以后续的操作是在MATLAB 2007a 中来验证这个转化的正确性:
     * in MATLAB command:
     * 将刚才生成的bmp文件之一考到matlab 工作目录;
     * >> I=imread('font_song_size380_20064.bmp');
     * >> A=imresize(I,0.1);
     * >> B=im2bw(A);
     * >> imshow(B);
     * >> size(B);
     * >> size(B)

     * ans =

     * 60    64

     * >> B
     * .....
     * >> imshow(B);
     * 
     * 显示一个“习”字,且B阵是一个汉字0,1点阵.
     * 当然你可以在matlab中循环生成所有unicode字符的点阵
     * */
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }


        //在Paint事件中处理从truetype到点阵字体图的生成
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
             Graphics g = this.CreateGraphics();                          //用于写屏幕的Graphics 对象g
             Bitmap bm = new Bitmap(640, 600);                            //最后生成的位图文件写入这个中

             Graphics g1 = Graphics.FromImage(bm);                        //存从屏幕考出来的图

             //unicode的内码循环,我这里只显示了有代表的几个字:
             //您可以把循环变量改为:for (int unicode_i = 0x0021; unicode_i <= 0x2FA1D; unicode_i ++) 
             //以显示所有可显示的unicode v5.1.0字符,参考http://www.babelstone.co.uk/Software/BabelMap.html

            for (int unicode_i = 0x4e60; unicode_i <= 0x4e64; unicode_i ++) 
            {
                    g.Clear( Color.LightGray);                                  //清除绘图区,并使用浅灰色填充背景
                    for (int i = 0; i < 64; i++)                                //画网格64*60,自己可以根据情况定义
                    {
                        for (int j = 0; j < 60; j++)
                        {
                            g.DrawRectangle(new Pen(Color.White), new Rectangle(i * 10, j * 10, 10, 10)); //白色画格子
                        }
                    }
                     
                    char c = Convert.ToChar( unicode_i );                      //循环变量(int)转化成unicode字符(char)

                    g.DrawString( c.ToString(), new Font("宋体", 380, FontStyle.Regular), Brushes.Red, new Point(0, 0)); 
                                                                              //画之,字体,大小,颜色自己选,我画在屏幕点0,0处是为了容易拷贝

                    g1.CopyFromScreen(0, 0, 0, 0, new Size(640, 600));       //从屏幕拷贝到另一个Graphics g1

                    string s = "char_bmp\\font_song_size380_" + unicode_i.ToString() + ".bmp"; 
                                                                            //文件名包含字体,大小,unicode内码等,
                                                                            //char_bmp目录需要你自己预先建立: 项目名\bin\Debug\char_bmp
                    bm.Save(s, System.Drawing.Imaging.ImageFormat.Bmp);           //将g1保存bmp为文件
           
            }
                                                                                  //释放资源
            bm.Dispose();
            g1.Dispose();
            g.Dispose();
            
        }

        private void Form1_Click(object sender, EventArgs e)
        {
            this.Close();                                                 //因为我将窗口的关闭钮屏蔽了,这里单击窗口则关闭程序
        }

    }
}
--------------------编程问答-------------------- 这么好,没人顶?
补充:.NET技术 ,  其他语言
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,