因為某些需要,得將文字以16x16的點陣圖輸出,所以就到網路上四處搜尋
最後讓我找到了一篇用Delphi寫的 抓Windows字型產生BIT資料的程式範例
可是他是Delphi,我用的卻是BCB
所以就開始解讀Delphi的工作啦~~
最後被我改寫:
//半形字轉為全形字
int Len = Edit->Text.Length();
char buf[255];
ZeroMemory(buf, sizeof(buf));
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, Edit->Text.c_str(), Len, buf, sizeof(buf));
AnsiString Zen = AnsiString(buf);
//將字串轉換成16x16的點陣圖
//本來用TImage,可是會漏字,所以改用TBitmap
Graphics::TBitmap *ImageText = new Graphics::TBitmap();
ImageText->Canvas->Font->Name = "細明體";
ImageText->Canvas->Font->Size = 12;
ImageText->Width = ImageText->Canvas->TextWidth(Zen.c_str());
ImageText->Height = ImageText->Canvas->TextHeight(Zen.c_str());
ImageText->Canvas->TextOut(0, 0, Zen.c_str());
int i, j, k;
COLORREF color;
int R_byte;
//每次跳過一個字的寬度
for(j=0; j>Width; j+=16)
{
unsigned char word[32];
int l=0;
//某字的高度
for(i=0; i
{
byte a = 0;
byte b = 0x80;
//某字的寬度
for(k=0; k<16; k++)
{
//判斷該像素值
color = ImageText->Canvas->Pixels[j+k][i];
R_byte = GetBValue(color);
if(R_byte==0)
a=a|b;
b=b>>1;
if(b==0)
{
word[l] = char(a);
b=0x80;
a=0;
l++;
}
}
if(b!=0x80)
{
word[l] = char(a);
l++;
}
}
}
其實中間判斷像素值的地方我看不太懂,有沒有人可以幫我解釋一下阿?
最後那個word[32]就是所謂的點陣字了
神奇的是:一定要用"細明體",而且字體大小要等於"12"才會剛好16x16。
2009年3月13日 星期五
BCB - 將文字轉為16x16的點陣字
訂閱:
張貼留言 (Atom)
1 則留言:
您好,
因為Delphi的程式範例已經失效了,可否給我您寫的這個程式的原始碼?
謝謝!
張貼留言