超难问题:求助高手!在画布上重写WINDOWS字符数据? ( 积分: 100 )

  • 主题发起人 主题发起人 y966
  • 开始时间 开始时间
Y

y966

Unregistered / Unconfirmed
GUEST, unregistred user!
每一种字体对应在WINDOWS里有一个字节数据英文(5*7=7个字节点阵),汉字(16*16=32个字节点阵),怎么才能将这些不同的字符的对应点阵字节取出来写回到画布上.取出来后,能否将其宽度放大一倍再写回画布上.请大虾们看看.
 
每一种字体对应在WINDOWS里有一个字节数据英文(5*7=7个字节点阵),汉字(16*16=32个字节点阵),怎么才能将这些不同的字符的对应点阵字节取出来写回到画布上.取出来后,能否将其宽度放大一倍再写回画布上.请大虾们看看.
 
主要是用来做什么用啊.
用TMetafile可以放大
procedure CreatePage(aPageNumber: Integer);
var
arryPage: array[1..10] of TMetafile;
FCanvas: TMetafileCanvas;
begin
arryPage[1] := TMetafile.Create;
arryPage[1].Width := FPageWidth;
arryPage[1].Height := FPageHeight;
try
FCanvas := TMetafileCanvas.Create(arryPage[1], 0);
FCanvas.Font.PixelsPerInch := 600; //注意这个属性.一般都用96我是往打印机上画才用的600
然后用FCanvas.StretchDraw可以放大缩小.不失真
finally
FCanvas.Free;
FCanvas := nil;
end;
arryPage[1].Free;
end;
 
主要用来达到人眼睛上的视觉,要控制下面一个LED议备,在下面的LED设备的ROM里的一种字体,其宽度是正常字体的两倍,高度一样,(中英文都是一样),现在要做的就是用户在选择宽字体的时候,在编缉框也有同样的显示.我想了半天,只在在画布上写了,但是无论选择哪种字体都无法显示出宽体;有个同仁说只有将这个字的实际点阵数取出来,将其宽度放大一倍,然后再写回画布上,就可以达到视觉效果.
 
二楼的方法我试了,无效呀.
procedure tform1.CreatePage(aPageNumber: Integer);
var
arryPage: array[1..10] of TMetafile;
FCanvas: TMetafileCanvas;
rect:trect;
begin
arryPage[1] := TMetafile.Create;
arryPage[1].Width := 100;//FPageWidth;
arryPage[1].Height := 50;//FPageHeight;
try
FCanvas := TMetafileCanvas.Create(arryPage[1], 0);
FCanvas.Font.PixelsPerInch := 600; //注意这个属性.一般都用96我是往打印机上画才用的600
// 然后用FCanvas.StretchDraw可以放大缩小.不失真
//fcanvas.Brush.Bitmap
label1.Canvas.StretchDraw(rect, FCanvas.Brush.Bitmap);
finally
FCanvas.Free;
FCanvas := nil;
end;
arryPage[1].Free;
end;
 
这个问题没有人能解呀.难道真的只有VC才能做吗,那是VC高手吹的.
 
难道真的只有VC才能做吗,?

VC 能做到, Delphi也能做到。我试试看。
 
等待,顶....
 
主要就是怎么从用户选择的字体对应到WINDOW的字库(西方字符,GB_2312等)去取点阵,因为WINDOS系统也是用点阵的方式来将数据显示出来的.然后重新将字节数据按对应的像素位写回到画布上.是有点难.竟然连这样的资料都查不到.
 
我觉得没有必要取点阵写字,应该利用Windows的功能在画布上写字。
这样可以随心所欲的使用各种现成的字型和大小。
至于在画布上取字的点阵那还是比较容易的。
 
这也叫超难问题?其实很简单,就是把图画的画布上,再按点取出来。比例自己调就好啦。以下是我做的一个相关的代码片断,自己看一看吧。
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.FillRect(Image1.ClientRect);
sz := Image1.Canvas.TextExtent(txtText.Text);
Image1.Canvas.TextOut(0, 0, txtText.Text);
for Y := 0 to sz.cy do begin
S := '';
for X := 0 to sz.cx - 1 do begin
if Image1.Canvas.Pixels[X, Y] = clWhite then
S := S + ' '
else
S := S + '*';
end;
while (S <> '') and (Copy(S, Length(S) - 1, 2) = ' ') do
SetLength(S, Length(S) - 2);

Memo1.Lines.Add(S);
end;
 
里面的SZ是什么变量呀.如果能实现效果也好,就不用那么复杂了.但是如果按上面说的思路要支GG2312去取点阵数据,那还是有点难的.不知道这种方法能否实现,因为可能要对取出的点阵数据再进行加工处理(比如说:对一个字再进行包边处理),再将其还原到画布上.
 
看一下 Image1.Canvas.TextExtent 的返回值说明不就知道 sz 是什么类型的变量了嘛。

至于你说的其他处理,你可以先把所有要处理的都做完,再把图抓下来,然后取点不就行了嘛。注:要真是想通过点阵做包边效果还是有难度的。
 
delphi2006:你好,实际上,这个问题现在已经出来了,为了这个问题我还发了个帖子,原来的思路是想在一个128*16的画布上写两行英文字.如果采用在WINDOWS自带字库的方法,在取到一个英文'A'的点阵数据后,也许可以很准确地将英文字符重画到画布上去.这样,就可以达到还原显示上下两行数据并且显示很准确无误,但是现在无法实现那重取点后再画图的方法,只能用画布的TEXTOUT(0,0,'A'),TEXTOUT(0,8,'A')方法来分两下两行写,但是现在写上去的文字跟本看不清了,不知这样TEXTOUT的方法和用点阵还原字符到低哪里不一样呀.
 
后退
顶部