(150分跳楼大放血)谁能告诉我“圆整字体边角”即“抗锯齿”是怎样实现的。(150分)

  • 主题发起人 主题发起人 sunmoonstar
  • 开始时间 开始时间
S

sunmoonstar

Unregistered / Unconfirmed
GUEST, unregistred user!
(150分跳楼大放血)谁能告诉我“圆整字体边角”即“抗锯齿”是怎样实现的。
象 PDF、reedBOOK、WPS2000、Word97那样,显示的字特别漂亮。
要求:1.要 delphi 程序实例,加注释,不要链接地点,太麻烦;
   2.不要和我讨价回价;
    符合上述情况的,分一定给,大不了改名换姓;
    货到付款,童叟无欺!
  mailto:dadicomp@china.com
 
我也想知道!
 
程序到没有,但原理稍微知道点!
在HP打印机等利用字体的字模,将要抗锯齿的的地方再进行插值运算,而得到。
至于有些漂亮的字体,有些并不是通过运算得来的,若果真如此,则这个系统慢
死了!?大多使用字模来实现,即每个字的每种字体都有一个字模与之对应。
 
还有哪位大爷知道,快来看看!!!!!
 
我提供一个方法,不知好不好,
把一个字错开一个象素重重叠显示出来
 
uses,有没有更好的方法?
 
先将文字放大一倍字号画到临时内存中, 再用AntiAlias算法缩小, 绝对光滑.
而且速度很快.我这有个AntiAlias算法的例子, 很简单但很说明问题:
其中核心代码如下:
procedure TAntiAliasForm.SeparateColor(color : TColor;
var r, g, b : Integer);
begin
r := color Mod 256;
g := (color Div 256) Mod 256;
b := color Div 65536;
end;

procedure TAntiAliasForm.CmdGoClick(Sender: TObject);
var
txt : String;
wid, hgt, x, y, i, j : Integer;
r, g, b, totr, totg, totb : Integer;
begin
txt := InputText.Text;
// Use the correct colors.
big_bm.Canvas.Font.Color := InputText.Font.Color;
big_bm.Canvas.Brush.Color := InputText.Color;
// Set the new font.
big_bm.Canvas.Font := InputText.Font;
big_bm.Canvas.Font.Size := 2 * InputText.Font.Size;
big_bm.Canvas.Refresh;
// Make the font take effect.
// Make big_bm and BigBox big enough.
wid := big_bm.Canvas.TextWidth(txt);
hgt := Round(big_bm.Canvas.TextHeight(txt) * 1.1);
big_bm.Width := wid;
big_bm.Height := hgt;
big_bm.Canvas.Refresh;
BigBox.Width := wid;
BigBox.Height := hgt;
BigBox.Refresh;
// Draw the text in big_bm.
big_bm.Canvas.TextOut(0, 0, txt);
// Display it in BigBox.
BigBox.Invalidate;
// ********************************
// Anti-alias the text into out_bm.
// ********************************
// Create a new out_bm.
// out_bm.Free;
- Removed by RLV on 12/29/97
// out_bm := TBitmap.Create;
- Removed by RLV on 12/29/97
out_bm.Width := wid Div 2;
out_bm.Height := hgt Div 2;
out_bm.Canvas.Refresh;
// The "- 3" keeps us from falling off the edge
// of BigBox. Over the edge Point would
// return -1 and mess up the colors.
for y := 0 to (big_bm.Height - 3) Div 2do
begin
for x := 0 to (big_bm.Width - 3) Div 2do
begin
// Compute the value of output pixel (x, y).
totr := 0;
totg := 0;
totb := 0;
for j := 0 to 1do
begin
for i := 0 to 1do
begin
SeparateColor(big_bm.Canvas.Pixels
[2 * x + i, 2 * y + j], r, g, b);
totr := totr + r;
totg := totg + g;
totb := totb + b;
end;
end;
out_bm.Canvas.Pixels[x, y] :=
RGB(totr Div 4, totg Div 4, totb Div 4);
end;
end;
OutBox.Invalidate;
// Remove the hourglass cursor.
Screen.Cursor := crDefault;
end;

当然, 它的代码还可以进一步优化, 比如用scanline代替pixels, 速度可以进一步
提高.
 
Another_eYes:
能不能给我mail一个实例,
如mail 过来,给你150 + 50分。
朱红波,sunmoonstar
mailto :dadicomp@china.com
 
后退
顶部