秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  276 随笔 :: 0 文章 :: 305 评论 :: 19万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
lazarus 显示(中文)点阵字符要带2个字体文件,想用res/lrs来摆脱hzk16.bin和asc16.bin,尝试用lazarus lrs/res资源文(读lrs部分得到“禁卫军”帮助),用以下方法都可以实现:
一、读取lrs资源文件
1、生成lrs文件:
将Hzk16.bin和asc16.bin生成font.lrs
lazres.exe font.lrs Hzk16.bin asc16.bin

2、一定要在Initialization引用lrs资源:

Initialization
{$I font.lrs} 

end.

3、引用方法:

复制代码
procedure LoadFontResource;
var
  LResource:TLResource;
  StringStream: TStringStream;
begin
  LResource := LazarusResources.Find('hzk16');//查找lrs中的hzk16
  if LResource <> nil then
  begin
    StringStream:=TStringStream.Create(LResource.Value);//找到后读取Hzk16
    try
      Hzk16FontData:=TMemoryStream.Create;
      StringStream.Position:=0;
      StringStream.SaveToStream(hzk16FontData);
    finally
      StringStream.Free;
    end;
  end;
  LResource := LazarusResources.Find('ASC16');
  if LResource <> nil then
  begin
    StringStream:=TStringStream.Create(LResource.Value);
    try
      ASC16FontData:=TMemoryStream.Create;
      StringStream.Position:=0;
      StringStream.SaveToStream(ASC16FontData);
    finally
      StringStream.Free;
    end;
  end;
end;
复制代码

lrs方式的完整代码:

复制代码
unit DispDotMatrixCode;

{$mode ObjFPC}{$H+}

interface

uses
  SysUtils,Classes,Graphics,ExtCtrls, LazUTF8,LConvEncoding,LResources;

var
  Hzk16FontData: TMemoryStream; // 用于存储点阵字体数据
  ASC16FontData: TMemoryStream; // 用于存储点阵字体数据

procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer);

implementation

procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer);
var
  strChar: String;
  i, n: integer;
  Image: TImage;
  f,fasc: file;
  x1:Integer;

  procedure MakeChar(Image:TImage;HZ: String;Chinese:Boolean;xs,wordGap:Integer);
  var
    h:AnsiString;
    OffSet: integer;
    GetStr: array [0..31] of byte;
    temp,dis:byte;
    x, y, i, j: integer;
    Q, W,dz,wd: word;
  begin
    if Chinese then
    begin
      dz:=31;
      wd:=15;
      h:=UTF8ToCP936(HZ);
      Q := Byte(H[1]) - $A0;
      W := Byte(H[2]) - $A0;
      OffSet := (94*(Q-1)+(W-1))*32;
      Hzk16FontData.Position:=OffSet;//+$54;
      Hzk16FontData.Read(GetStr,32);
    end
    else
    begin
      dz:=15;
      wd:=7;
      W := Byte(Hz[1]);
      OffSet := W*16;
      ASC16FontData.Position:=OffSet;//+$54;
      ASC16FontData.Read(GetStr,16);
    end;
    x:=0;
    y:=0;
    i:=0;
    j:=0;
    while(i<=dz) do
    begin
      temp:=getstr[i];
      for j:=0 to 7 do
      begin
        dis:=temp and 128;
        dis:=dis shr 7;
        if dis=1 then
        begin
          Image.Canvas.Rectangle(x1+(x+1)*xs-1,(y+1)*xs-1,x1+(x+1)*xs-1+xs,(y+1)*xs-1+xs);
        end;
        inc(x);
        if x>wd then
        begin
          x:=0;
          inc(y);
        end;
        temp:=temp shl 1;
      end;
      inc(i);
    end;
    if wordGap<0 then wordGap:=5;
    x1:=x1+wd+wd*(xs-1)+wordGap;
  end;
begin
  x1:=0;
  bs:=bs*3;
  if bs<3 then bs:=3;
  Image:=TImage.Create(nil);
  Image.Width:=Width;
  Image.Height:=Height;
  Image.Canvas.Brush.Color := clBlack;
  Image.Canvas.FillRect(rect(0,0,Width,Height));
  Image.Canvas.Brush.Color :=TextColor;
  Image.Canvas.Pen.Color := clBlack;
  if Length(str) > 0 then begin
    for i := 0 to utf8Length(str) - 1 do begin
       strChar := utf8Copy(str, i+1, 1);
      if ord(strChar[1])>127 then
        MakeChar(Image,strChar,true,bs,wordGap)
      else
        MakeChar(Image,strChar,false,bs,wordGap);
    end;
    Images.Picture.Assign(Image.Picture);
  end;
  FreeAndNil(image);
end;

procedure LoadFontResource;
var
  LResource:TLResource;
  StringStream: TStringStream;
begin
  LResource := LazarusResources.Find('hzk16');
  if LResource <> nil then
  begin
    StringStream:=TStringStream.Create(LResource.Value);
    try
      Hzk16FontData:=TMemoryStream.Create;
      StringStream.Position:=0;
      StringStream.SaveToStream(hzk16FontData);
    finally
      StringStream.Free;
    end;
  end;
  LResource := LazarusResources.Find('ASC16');
  if LResource <> nil then
  begin
    StringStream:=TStringStream.Create(LResource.Value);
    try
      ASC16FontData:=TMemoryStream.Create;
      StringStream.Position:=0;
      StringStream.SaveToStream(ASC16FontData);
    finally
      StringStream.Free;
    end;
  end;
end;

Initialization
{$I font.lrs}
LoadFontResource;

finalization
FreeAndNil(Hzk16FontData);
FreeAndNil(asc16FontData);

end.
复制代码

 二、读取res资源文件

1、生成Res文件:
1)编写rc文件:

ASC16 RCDATA "ASC16.bin"
Hzk16 RCDATA "Hzk16.bin"

2)、将rc文件编译为Res文件
I)用delphi的brcc32.exe:

brcc32 font.rc

II)用lazarus/fpc自带的fpcres.exe
-of res  指定生成为res格式 
-o font.res 指定生成的文件名称

fpcres -of res -o font.res font.rc

 注意:用第三方的工具(resource_hacker/ResEdit等)生成的res发现在lazarus存在兼容问题。

2、设置res资源(有2种方法):

1)Project-->Options-->Project Options-->Resources-->Add添加相应的文件

2)第2个方法,用代码添加指定资源文件:

implementation

{$R *.lfm}
{$R font.res}

3、代码部分:

复制代码
procedure LoadFontResource;
begin
  ResourceStream := TResourceStream.Create(HInstance, 'HZK16', RT_RCDATA);//从Res读取Hzk16字体
  try
    Hzk16FontData:=TMemoryStream.Create;
    ResourceStream.Position:=0;
    ResourceStream.SaveToStream(hzk16FontData);
  finally
    ResourceStream.Free;
  end;
  ResourceStream := TResourceStream.Create(HInstance, 'ASC16', RT_RCDATA);//从Res读取ASC6字体
  try
    ASC16FontData:=TMemoryStream.Create;
    ResourceStream.Position:=0;
    ResourceStream.SaveToStream(ASC16FontData);
  finally
    ResourceStream.Free;
  end;
end;
复制代码

 4、Res方式的完整代码:

复制代码
unit DispDotMatrixCode;

{$mode ObjFPC}{$H+}

interface

uses
  LCLType,SysUtils,Classes,Graphics,ExtCtrls, LazUTF8,LConvEncoding,LResources;

var
  Hzk16FontData: TMemoryStream; // 用于存储点阵字体数据
  ASC16FontData: TMemoryStream; // 用于存储点阵字体数据
  ResourceStream : TResourceStream;

procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer);

implementation
{$R font.res}

procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer);
var
  strChar: String;
  i, n: integer;
  Image: TImage;
  f,fasc: file;
  x1:Integer;

  procedure MakeChar(Image:TImage;HZ: String;Chinese:Boolean;xs,wordGap:Integer);
  var
    h:AnsiString;
    OffSet: integer;
    GetStr: array [0..31] of byte;
    temp,dis:byte;
    x, y, i, j: integer;
    Q, W,dz,wd: word;
  begin
    if Chinese then
    begin
      dz:=31;
      wd:=15;
      h:=UTF8ToCP936(HZ);
      Q := Byte(H[1]) - $A0;
      W := Byte(H[2]) - $A0;
      OffSet := (94*(Q-1)+(W-1))*32;
      Hzk16FontData.Position:=OffSet;//+$54;
      Hzk16FontData.Read(GetStr,32);
    end
    else
    begin
      dz:=15;
      wd:=7;
      W := Byte(Hz[1]);
      OffSet := W*16;
      ASC16FontData.Position:=OffSet;//+$54;
      ASC16FontData.Read(GetStr,16);
    end;
    x:=0;
    y:=0;
    i:=0;
    j:=0;
    while(i<=dz) do
    begin
      temp:=getstr[i];
      for j:=0 to 7 do
      begin
        dis:=temp and 128;
        dis:=dis shr 7;
        if dis=1 then
        begin
          Image.Canvas.Rectangle(x1+(x+1)*xs-1,(y+1)*xs-1,x1+(x+1)*xs-1+xs,(y+1)*xs-1+xs);
        end;
        inc(x);
        if x>wd then
        begin
          x:=0;
          inc(y);
        end;
        temp:=temp shl 1;
      end;
      inc(i);
    end;
    if wordGap<0 then wordGap:=5;
    x1:=x1+wd+wd*(xs-1)+wordGap;
  end;
begin
  x1:=0;
  bs:=bs*3;
  if bs<3 then bs:=3;
  Image:=TImage.Create(nil);
  Image.Width:=Width;
  Image.Height:=Height;
  Image.Canvas.Brush.Color := clBlack;
  Image.Canvas.FillRect(rect(0,0,Width,Height));
  Image.Canvas.Brush.Color :=TextColor;
  Image.Canvas.Pen.Color := clBlack;
  if Length(str) > 0 then begin
    for i := 0 to utf8Length(str) - 1 do begin
       strChar := utf8Copy(str, i+1, 1);
      if ord(strChar[1])>127 then
        MakeChar(Image,strChar,true,bs,wordGap)
      else
        MakeChar(Image,strChar,false,bs,wordGap);
    end;
    Images.Picture.Assign(Image.Picture);
  end;
  FreeAndNil(image);
end;

procedure LoadFontResource;
var
  ResHandle: TLResource;
begin
  ResourceStream := TResourceStream.Create(HInstance, 'HZK16', RT_RCDATA);
  try
    Hzk16FontData:=TMemoryStream.Create;
    ResourceStream.Position:=0;
    ResourceStream.SaveToStream(hzk16FontData);
  finally
    ResourceStream.Free;
  end;
  ResourceStream := TResourceStream.Create(HInstance, 'ASC16', RT_RCDATA);
  try
    ASC16FontData:=TMemoryStream.Create;
    ResourceStream.Position:=0;
    ResourceStream.SaveToStream(ASC16FontData);
  finally
    ResourceStream.Free;
  end;
end;

Initialization
LoadFontResource;

finalization

end.
复制代码

 编译后已不用带hzk16.bin和asc16.bin,在Linux运行正常:

 

posted on   秋·风  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示