日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

Delphi中創(chuàng)建指定大小字體與讀取該字體點(diǎn)陣信息的函數(shù)

Delphi中創(chuàng)建指定大小字體與讀取該字體點(diǎn)陣信息的函數(shù)

更新時(shí)間:2021-09-25 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

由于要控制硬件,需要把矢量的漢字轉(zhuǎn)化為點(diǎn)陣信息寫入eprom或在液晶屏上顯示,因此用Delphi寫了如下的函數(shù),可以把指定的一個(gè)漢字(兩個(gè)字符)轉(zhuǎn)化為點(diǎn)陣信息保存到文件,每個(gè)點(diǎn)對(duì)應(yīng)一個(gè)位,有文字信息該位為1,否則為0。

目前該函數(shù)可以生成指定的大小漢字并讀取成點(diǎn)陣字模信息保存到文件。

如ConvertToMatrix(Pchar('北'),6,18,'Font.dat')將生成12*18點(diǎn)陣文件Font.dat,其中保存漢字‘北’的字模。文件格式是從上到下,先行后列,如下圖,第一行保存00 00,第二行是90 00 (均是16進(jìn)制,余下個(gè)行類推)





//轉(zhuǎn)化一個(gè)漢字為點(diǎn)陣信息Text為一個(gè)漢字,ChrWidth是字符寬,漢字是兩個(gè)字符大小,所有如果要生成寬是12的漢字則ChrWidth為6,ChrWidth目前最多是8,因?yàn)榇蠖鄶?shù)的硬件使用的點(diǎn)陣信息是16以下ChrHeight是漢字的高,SaveFileName是保存該漢字點(diǎn)陣信息的文件名。
function ConvertToMatrix(Text:PChar;
  ChrWidth,ChrHeight:Byte; SaveFileName:Pchar):Bool;
type
   PBITMAPINFO=^TBitmapInfo;
var
  TempBmp:TBitmap;
  lpvSBits,lpvDBits:Pchar;
  dOffset,sOffset:integer;
  DC:HDC;
  TheFont: HFont;

  BMIInfo:PBITMAPINFO;
  DS: TDIBSection;
  BMIbuf:array[0..2047]of byte;

  i,j:integer;//循環(huán)控制

  wData:WORD;//保存字體每行的點(diǎn)陣信息,最多16位,不足16位忽略多余的高位

  MemoryStream:TMemoryStream;

begin
  //大于一個(gè)字退出
  if Length(Text)>2 then
  begin
    ShowMessage('請轉(zhuǎn)化一個(gè)漢字!');
    Result:=False;
    Exit;
  end;
  //參數(shù)合理否
  if (ChrWidth=0) or (ChrHeight=0) or (SaveFileName = '') then
  begin
    ShowMessage('參數(shù)錯(cuò)誤!');
    Result:=False;
    Exit;
  end;
  //建立流
  MemoryStream:=TMemoryStream.Create;
  //建立臨時(shí)文件
  TempBmp:=TBitmap.Create;
  //設(shè)定為256色
  TempBmp.PixelFormat:= pf8bit;
  //設(shè)定圖寬度
  TempBmp.Width:=ChrWidth * Length(Text);
  //設(shè)定圖高度
  TempBmp.Height:= ChrHeight;
  //得到BMP文件HDC
  DC:=TempBmp.Canvas.Handle;
  //建立邏輯字體
  TheFont := CreateFont(ChrHeight,ChrWidth, 0, 0, 400, 0, 0, 0,
    GB2312_CHARSET, Out_Default_Precis, Clip_Default_Precis,
    Default_Quality, Default_Pitch OR FF_SCRIPT, 'script');
  //指定字體給DC
  SelectObject(DC,TheFont);
  //寫入指定字符串
  TextOut(DC,0,0,Pchar(Text),Length(Text));
  //釋放邏輯字體
  DeleteObject(TheFont);

  //取得Bmp信息到lpvSBits
  BMIInfo:=PBITMAPINFO(@BMIbuf);
  //分配內(nèi)存
  lpvSBits:=AllocMem(TempBmp.Width*TempBmp.Height);
  lpvDBits:=AllocMem(TempBmp.Width*TempBmp.Height);
  //建立程序屏幕兼容的DC
  DC := CreateCompatibleDC(0);
  //返回指定的BMP信息到DS中保存
  GetObject(TempBmp.Handle, SizeOf(DS), @DS);
  //讀取頭信息
  BMIInfo.bmiHeader:=ds.dsBmih;
  //讀入DIB
  GetDIBits(DC, TempBmp.Handle, 0, ds.dsBmih.biHeight,lpvSBits,
    BMIInfo^ , DIB_RGB_COLORS);
  //倒置圖像
  for i:=0 to TempBmp.Height-1 do
  begin
    sOffset:=i*TempBmp.Width;
    dOffset:=(TempBmp.Height-i-1)*TempBmp.Width;
    CopyMemory(lpvDBits+dOffset,lpvSBits+sOffset,TempBmp.Width);
  end;
  //保存文件
  for i:=0 to TempBmp.Height-1 do
  begin
    wData:=0;
    for j:=0 to TempBmp.Width-1 do
    begin
      //ShowMessage(inttostr(ord((lpvDBits+i*TempBmp.Width+j)^)));
      if ord((lpvDBits+i*TempBmp.Width+j)^)=0 then
      begin
        wData:=(wData shl 1)OR 1;
      end
      else
      begin
        wData:=(wData shl 1)OR 0;
      end;
    end;
    MemoryStream.Write(wData,SizeOf(wData));
  end;

  MemoryStream.SaveToFile(SaveFileName);
  MemoryStream.Free;
//TempBmp.SaveToFile('temp.bmp')可刪除,存'temp.bmp'文件的目的只是為對(duì)比察看
  TempBmp.SaveToFile('temp.bmp');
  TempBmp.Free;
  result:=True;

end;


附:本文全部為原創(chuàng)內(nèi)容,如果您使用中對(duì)程序做了改動(dòng)請發(fā)給作者一分webmaster@daheng-image.com;引用是請注明作者Thermometer和Email,謝謝。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 婷婷综合国产激情在线 | 久久草影视 | 日韩精品第一 | 久久国产影视 | 亚洲精品久久久久午夜 | 老子影院午夜伦不卡亚洲 | 亚洲欧美v | 中文字幕精品在线观看 | 色噜噜狠狠成人网 | 五月天激激婷婷大综合蜜芽 | 日韩欧美综合 | 99资源在线 | 欧美专区在线视频 | 奇奇影院理论片在线观看 | 黄网站色在线视频免费观看 | 在线看黄色网址 | 欧美伊人久久久久久久久影院 | 亚洲另类欧美日韩 | 亚州中文字幕 | 久久这里只有精品免费视频 | 午夜精品久久久久久 | 国产一区二区三区樱花动漫 | 国产综合视频 | 日日夜夜精品 | 亚洲欧美一区二区三区不卡 | 亚洲高清网站 | 成人免费在线视频网 | 国产性色强伦免费看视频 | 好逼天天干 | 亚洲精品国产免费 | aa级毛片毛片免费观看久 | 国产成人a在一区线观看高清 | 天天躁夜夜躁狠狠躁 | 国产成人亚洲日本精品 | 亚洲一区二区三区免费 | 日本免费一二三区 | 夜夜骑日日操 | 毛片视频播放 | 日本在线观看免费视频 | 91精品国产高清久久久久久91 | 碰免费人人人视频 |