zoukankan      html  css  js  c++  java
  • Delphi中建立指定大小字体和读取该字体点阵信息的函数(转)

    源:Delphi中建立指定大小字体和读取该字体点阵信息的函数

    Delphi中建立指定大小字体和读取该字体点阵信息的函数

    作者:Thermometer Email:  webmaster@daheng-image.com

      由于要控制硬件,需要把矢量的汉字转化为点阵信息写入eprom或在液晶屏上显示,因此用Delphi写了如下的函数,可以把指定的一个汉字(两个字符)转化为点阵信息保存到文件,每个点对应一个二进制位,有文字信息该位为1,否则为0。

      目前该函数可以生成指定大小的汉字并可读取点阵字模信息保存到文件。

      如ConvertToMatrix(Pchar('北'),6,18,'Font.dat')将生成12*18点阵文件Font.dat,其中保存汉字‘北’的字模信息。文件格式是从上到下,先行后列,如下图,第一行保存为00 00,第二行是90 00 (均是16进制,余下个行类推)

    //转化一个汉字为点阵信息。参数Text为一个汉字,ChrWidth是字符宽,汉字是两个字符大小,所以如果要生成宽是12的汉字则ChrWidth为6,ChrWidth目前最多是8,因为大多数的硬件使用的点阵信息是16以下ChrHeight是汉字的高,SaveFileName是保存该汉字点阵信息的文件名。
    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;//循环控制
    
      wData:WORD;//保存字体每行的点阵信息,最多16位,不足16位忽略多余的高位
    
      MemoryStream:TMemoryStream;
    
    begin
      //大于一个字退出
      if Length(Text)>2 then
      begin
        ShowMessage('请转化一个汉字!');
        Result:=False;
        Exit;
      end;
      //参数合理否
      if (ChrWidth=0) or (ChrHeight=0) or (SaveFileName = '') then
      begin
        ShowMessage('参数错误!');
        Result:=False;
        Exit;
      end;
      //建立流
      MemoryStream:=TMemoryStream.Create;
      //建立临时文件
      TempBmp:=TBitmap.Create;
      //设定为256色
      TempBmp.PixelFormat:= pf8bit;
      //设定图宽度
      TempBmp.Width:=ChrWidth * Length(Text);
      //设定图高度
      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);
      //分配内存
      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;
      FreeMem(lpvSBits);
      FreeMem(lpvDBits);
      result:=True;
    
    end;

    附:本文全部为原创内容,如果您使用中对程序做了改动请发给作者一分webmaster@daheng-image.com;引用时请注明原创作者是Thermometer并写清楚原创者的eMail,谢谢。

  • 相关阅读:
    React Native组件左右两端展示(flex:1、justifyContent:'space-between')
    iOS 蓝牙开发详解(基本知识、相关类图、交互流程)
    iOS 蓝牙开发 Mac地址问题
    AFNetwork监听网络失效
    查看linux系统版本和cpu
    docker常用命令
    docker 常用命令--镜像删除
    docker部署nginx
    常见数据库会话查询脚本
    DB性能瓶颈分析思路
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4413918.html
Copyright © 2011-2022 走看看