如何将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技术 , 其他语言