• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

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

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

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

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

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

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

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





        //轉(zhuǎn)化一個漢字為點(diǎn)陣信息Text為一個漢字,ChrWidth是字符寬,漢字是兩個字符大小,所有如果要生成寬是12的漢字則ChrWidth為6,ChrWidth目前最多是8,因為大多數(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
          //大于一個字退出
          if Length(Text)>2 then
          begin
            ShowMessage('請轉(zhuǎn)化一個漢字!');
            Result:=False;
            Exit;
          end;
          //參數(shù)合理否
          if (ChrWidth=0) or (ChrHeight=0) or (SaveFileName = '') then
          begin
            ShowMessage('參數(shù)錯誤!');
            Result:=False;
            Exit;
          end;
          //建立流
          MemoryStream:=TMemoryStream.Create;
          //建立臨時文件
          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'文件的目的只是為對比察看
          TempBmp.SaveToFile('temp.bmp');
          TempBmp.Free;
          result:=True;

        end;


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

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

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 久久亚洲精品无码AV红樱桃| 亚洲av伊人久久综合密臀性色| 亚洲国产午夜电影在线入口| 久久精品一区二区免费看| 亚洲韩国精品无码一区二区三区| a级毛片免费高清视频| 国产偷国产偷亚洲高清日韩| 国产免费内射又粗又爽密桃视频 | a一级毛片免费高清在线| 亚洲精品成人a在线观看| 九九免费观看全部免费视频| 亚洲色欲久久久久综合网| 老司机精品免费视频| 精品国产综合成人亚洲区| 日日麻批免费40分钟无码| 亚洲高清中文字幕| 最近中文字幕免费mv视频7| 亚洲AV永久无码精品一福利| 亚洲成AⅤ人影院在线观看| xvideos永久免费入口| 亚洲国产天堂久久综合网站| 亚洲香蕉免费有线视频| 亚洲精品理论电影在线观看| 亚洲高清最新av网站| 成人性生交大片免费看中文| 亚洲精品中文字幕无乱码| 日韩a级毛片免费观看| a免费毛片在线播放| 亚洲精品第五页中文字幕| 精品国产免费观看一区| 中文字幕久无码免费久久| 亚洲欧洲精品在线| 国产精品久免费的黄网站| 国产啪精品视频网站免费尤物 | 久久久亚洲精品无码| 国产美女在线精品免费观看| 美女尿口扒开图片免费| 亚洲∧v久久久无码精品| 午夜时刻免费入口| 久久久久免费精品国产| 亚洲精品乱码久久久久久蜜桃图片|