2009年3月13日 星期五

BCB - 將文字轉為16x16的點陣字

因為某些需要,得將文字以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; iHeight; 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。

1 則留言:

Unknown 提到...

您好,
因為Delphi的程式範例已經失效了,可否給我您寫的這個程式的原始碼?

謝謝!