这样的算法如何实现?
75 个解决方案
#1
普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
#2
自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
#3
TrueType字体~
#4
如果是点阵字体平滑算法也没用。想要大小都平滑就用TrueType。
如果非用点阵,就用TrueType字体生成点阵字体。
如果非用点阵,就用TrueType字体生成点阵字体。
#5
最初,Windows使用了13种TrueType字体,它们的字体名称如下: Courier New Courier New Bold Courier New Italic Courier New Bold Italic Times New Roman Times New Roman Bold Times New Roman Italic Times New Roman Bold Italic Arial Arial Bold Arial Italic Arial Bold Italic Symbol 在新的Windows版本中,这个列表更长了。现在最好看的是微软雅黑体,是Windows Vista的默认系统字体,Windows XP也可改装。
==============================================================================
这些字体我都试了,效果还是那样。程序要做成能随便设置字体的。搞了好久了,头疼。
==============================================================================
这些字体我都试了,效果还是那样。程序要做成能随便设置字体的。搞了好久了,头疼。
#6
http://topic.csdn.net/t/20020902/19/990592.html,大家可以看看这个帖子。
#7
以前给朋友做过类似的东西,不过暂时不能开源,呵呵
#8
平滑特效字体控件包AAFont,这个里有相关算法,可惜是delphi写的
#9
看看微软官方网站truetype字体的文档吧,数据中存储的也是点阵字体,不过经过复杂算法读出后就成平滑的了
#10
budong
#11
#12
找了好久了 悲剧啊
#13
#14
GDI+ 的文字平滑肯定是可以满足你要求的!
首先,你要平滑的字体做什么!
如果你连 Adobe 和 微软 的效果都看不上,你是不会找到更好的结果的。
不知道你是真的看不上,还是压根就没用对!
别折腾了,就Adobe和GDI+选一个了。
你自己找算法是在搞笑!或者说,你只是想搞一会算法玩一玩!
首先,你要平滑的字体做什么!
如果你连 Adobe 和 微软 的效果都看不上,你是不会找到更好的结果的。
不知道你是真的看不上,还是压根就没用对!
别折腾了,就Adobe和GDI+选一个了。
你自己找算法是在搞笑!或者说,你只是想搞一会算法玩一玩!
#15
自己找算法不可行, 楼主还是用GDI+吧, 现在图形奇点算法都没完全解决呢,别说锯齿问题了,你的显示器的原理本身就是点阵的.
#16
找了好久了 悲剧啊
#17
对呀,用GDI+肯定可行的呀
#18
学到了好多
#19
Adobe的效果很好,但是GDI+效果不太好(可能是我不太会用,有demo的兄弟能否给我看看?)。以前的一种做法是把字体放大,然后做平滑处理,然后再缩小字体。不知道哪位兄弟有好的办法。
#20
学到的东西有用呀!
#21
学习 学习 谢谢分享
#22
现在还没用到,帮顶了
#23
学习中~~
#24
GDI本身就支持插值的方式平滑字体,不是必须用GDI+。插值方式很简单,在有锯齿的地方填充DC背景色和相邻颜色的平均值,离字形越近的插值越接近字体色,离字形越远的插值越接近背景色。这种方式有个缺点,DC必须有背景色,如果设置透明,默认取黑色作为背景色,如果你把DC中绘制出的字形数据抠出来贴到白色或浅色背景的其它位图或DC中,就可以看到字体有明显的黑边,没办法,这是插值算法需要的背景色跟目标背景色不同造成的。
#25
普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
#26
#27
学习 学习
#28
#29
好深奥!大概我是初学者的原故吧
#30
#31
trueType是矢量的吗?
#32
自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
#33
相对有道理
#34
#35
嗯
,谢谢啦。
,谢谢啦。
#36
看看微软官方网站truetype字体的文档吧
#37
这套控件是用DELPHI写的,但是看起来很清晰,我把它的核心平滑代码截出来了供你参考:
procedure TAAMask.DrawMaskEx(Text: string; Extend: TSize; Point: TPoint);
var
i, j: Integer;
pS1, pS2, pS3, pS4: PByteArray;
pDes: PByteArray;
x, y: Integer;
P: TPoint;
LogFont: TLogFont;
Beta: Double;
TextSize: TSize;
R: TRect;
begin
if (AAFont = nil) or (AAFont.Canvas = nil) then
Exit;
InitGrayBmp;
FWidth := Extend.cx; //大小
FHeight := Extend.cy;
if GrayBmp.Width < Width * Scale then //放大
GrayBmp.Width := Width * Scale;
if GrayBmp.Height < Height * Scale then
GrayBmp.Height := Height * Scale;
GetObject(AAFont.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
with LogFont do
begin
lfHeight := lfHeight * Scale;
lfWidth := lfWidth * Scale;
Beta := lfEscapement * Pi / 1800;
end;
GrayBmp.Canvas.Font.Handle := CreateFontIndirect(LogFont);
GrayBmp.Canvas.Font.Color := clWhite;
FillRect(GrayBmp.Canvas.Handle, Bounds(0, 0, GrayBmp.Width, GrayBmp.Height), 0);
x := Point.x * Scale;
y := Point.y * Scale;
if Beta <> 0 then // 考虑字体旋转
begin
TextSize := TextExtentEx(Text, P);
Inc(x, P.x * Scale);
Inc(y, P.y * Scale);
end;
R := Bounds(0, 0, GrayBmp.Width, GrayBmp.Height);
Windows.TextOut(GrayBmp.Canvas.Handle, x, y, PChar(Text), Length(Text));
BytesLineGray := (GrayBmp.Width + 3) div 4 * 4; //扫描线宽度
BytesLineMask := (Width + 3) div 4 * 4;
ReAllocMem(FpMaskBuff, BytesLineMask * Height);
pS1 := GrayBmp.ScanLine[0]; //源灰度图
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pS4 := PByteArray(Integer(pS3) - BytesLineGray);
pDes := PByteArray(Integer(pMaskBuff) + (Height - 1) * BytesLineMask);
//目标灰度为源矩形块的平均值
case Quality of
aqHigh:
begin //高精度4X4采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 4;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] + pS1^[x + 2] + pS1^[x + 3] +
pS2^[x] + pS2^[x + 1] + pS2^[x + 2] + pS2^[x + 3] +
pS3^[x] + pS3^[x + 1] + pS3^[x + 2] + pS3^[x + 3] +
pS4^[x] + pS4^[x + 1] + pS4^[x + 2] + pS4^[x + 3]) shr 4;
end;
pS1 := PByteArray(Integer(pS4) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pS4 := PByteArray(Integer(pS3) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqNormal:
begin //普通精度3X3采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 3;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] + pS1^[x + 2] shr 1 +
pS2^[x] + pS2^[x + 1] + pS2^[x + 2] +
pS3^[x] shr 1 + pS3^[x + 1] + pS3^[x + 2]) shr 3;
end;
pS1 := PByteArray(Integer(pS3) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqLow:
begin //低精度2X2采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 2;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] +
pS2^[x] + pS2^[x + 1]) shr 2;
end;
pS1 := PByteArray(Integer(pS2) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqNone:
begin //无平滑效果
for i := 0 to Height - 1 do
begin
CopyMemory(pDes, pS1, Width);
pS1 := PByteArray(Integer(pS1) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
end;
FreeGrayBmp;
end;
#38
这个控件包是CnPack的一部分。
#39
晕晕的过去了..........
#40
用TrueType字体~
#41
千万别给前面个发代码的给害了。
我告诉你吧! 除了FixedSys字体,其他字体都可以平滑处理,在GDI中。
FixedSYS字体不能平衡的原因不是不支持,而是这是这个字体的一个特点!
或者这么说,你在系统字体对话框里找到的都可以平滑。
Graphics::SetTextRenderingHint(TextRenderingHintAntiAlias)
记得,当字体尺寸大于12的时候再开抗锯齿,太小了开抗锯齿反而不好!
我告诉你吧! 除了FixedSys字体,其他字体都可以平滑处理,在GDI中。
FixedSYS字体不能平衡的原因不是不支持,而是这是这个字体的一个特点!
或者这么说,你在系统字体对话框里找到的都可以平滑。
Graphics::SetTextRenderingHint(TextRenderingHintAntiAlias)
记得,当字体尺寸大于12的时候再开抗锯齿,太小了开抗锯齿反而不好!
#42
最近也需要处理图形方面的知识,在Directdraw表面画不规则区域,任意增加删除节点构成透明图形,有这类算法吗
#43
另外,给你个经验! 如果有一段源码你想使用! 而不是通过它去学习API的用法。
这段源码包含汗多数学处理。或者行数超过100。只有在两个情况下你可以使用:
1、这段代码已经被网上成千上万的人用过,并且有专门的团队来维护,并且如果你关键词合适,他出现在
google的第一条
2、这段代码来自微软,或者和微软差不多大的公司。
除了上面两个条件,你最好只用你自己的代码!
否则,你就将成为试验品,而那个写代码根本无视你的痛苦,他只会沾沾自喜有人在用他的代码。
这段源码包含汗多数学处理。或者行数超过100。只有在两个情况下你可以使用:
1、这段代码已经被网上成千上万的人用过,并且有专门的团队来维护,并且如果你关键词合适,他出现在
google的第一条
2、这段代码来自微软,或者和微软差不多大的公司。
除了上面两个条件,你最好只用你自己的代码!
否则,你就将成为试验品,而那个写代码根本无视你的痛苦,他只会沾沾自喜有人在用他的代码。
#44
这个DirectX本来就有! 你为什么就不能把SDK里的例子程序全试验一遍再出手!
#45
#46
#47
每天冒泡,挣点分
#48
每天冒泡,挣点分
#49
锯齿都是有的。photoshop也一样,你用放大镜把它的字体放大显示,就明白是怎么回事了。
#50
#1
普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
#2
自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
#3
TrueType字体~
#4
如果是点阵字体平滑算法也没用。想要大小都平滑就用TrueType。
如果非用点阵,就用TrueType字体生成点阵字体。
如果非用点阵,就用TrueType字体生成点阵字体。
#5
最初,Windows使用了13种TrueType字体,它们的字体名称如下: Courier New Courier New Bold Courier New Italic Courier New Bold Italic Times New Roman Times New Roman Bold Times New Roman Italic Times New Roman Bold Italic Arial Arial Bold Arial Italic Arial Bold Italic Symbol 在新的Windows版本中,这个列表更长了。现在最好看的是微软雅黑体,是Windows Vista的默认系统字体,Windows XP也可改装。
==============================================================================
这些字体我都试了,效果还是那样。程序要做成能随便设置字体的。搞了好久了,头疼。
==============================================================================
这些字体我都试了,效果还是那样。程序要做成能随便设置字体的。搞了好久了,头疼。
#6
http://topic.csdn.net/t/20020902/19/990592.html,大家可以看看这个帖子。
#7
以前给朋友做过类似的东西,不过暂时不能开源,呵呵
#8
平滑特效字体控件包AAFont,这个里有相关算法,可惜是delphi写的
#9
看看微软官方网站truetype字体的文档吧,数据中存储的也是点阵字体,不过经过复杂算法读出后就成平滑的了
#10
budong
#11
#12
找了好久了 悲剧啊
#13
#14
GDI+ 的文字平滑肯定是可以满足你要求的!
首先,你要平滑的字体做什么!
如果你连 Adobe 和 微软 的效果都看不上,你是不会找到更好的结果的。
不知道你是真的看不上,还是压根就没用对!
别折腾了,就Adobe和GDI+选一个了。
你自己找算法是在搞笑!或者说,你只是想搞一会算法玩一玩!
首先,你要平滑的字体做什么!
如果你连 Adobe 和 微软 的效果都看不上,你是不会找到更好的结果的。
不知道你是真的看不上,还是压根就没用对!
别折腾了,就Adobe和GDI+选一个了。
你自己找算法是在搞笑!或者说,你只是想搞一会算法玩一玩!
#15
自己找算法不可行, 楼主还是用GDI+吧, 现在图形奇点算法都没完全解决呢,别说锯齿问题了,你的显示器的原理本身就是点阵的.
#16
找了好久了 悲剧啊
#17
对呀,用GDI+肯定可行的呀
#18
学到了好多
#19
Adobe的效果很好,但是GDI+效果不太好(可能是我不太会用,有demo的兄弟能否给我看看?)。以前的一种做法是把字体放大,然后做平滑处理,然后再缩小字体。不知道哪位兄弟有好的办法。
#20
学到的东西有用呀!
#21
学习 学习 谢谢分享
#22
现在还没用到,帮顶了
#23
学习中~~
#24
GDI本身就支持插值的方式平滑字体,不是必须用GDI+。插值方式很简单,在有锯齿的地方填充DC背景色和相邻颜色的平均值,离字形越近的插值越接近字体色,离字形越远的插值越接近背景色。这种方式有个缺点,DC必须有背景色,如果设置透明,默认取黑色作为背景色,如果你把DC中绘制出的字形数据抠出来贴到白色或浅色背景的其它位图或DC中,就可以看到字体有明显的黑边,没办法,这是插值算法需要的背景色跟目标背景色不同造成的。
#25
普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
点阵字体:http://baike.baidu.com/view/1941516.htm
TrueType:http://baike.baidu.com/view/333247.htm
#26
#27
学习 学习
#28
#29
好深奥!大概我是初学者的原故吧
#30
#31
trueType是矢量的吗?
#32
自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
#33
相对有道理
#34
#35
嗯
,谢谢啦。
,谢谢啦。
#36
看看微软官方网站truetype字体的文档吧
#37
这套控件是用DELPHI写的,但是看起来很清晰,我把它的核心平滑代码截出来了供你参考:
procedure TAAMask.DrawMaskEx(Text: string; Extend: TSize; Point: TPoint);
var
i, j: Integer;
pS1, pS2, pS3, pS4: PByteArray;
pDes: PByteArray;
x, y: Integer;
P: TPoint;
LogFont: TLogFont;
Beta: Double;
TextSize: TSize;
R: TRect;
begin
if (AAFont = nil) or (AAFont.Canvas = nil) then
Exit;
InitGrayBmp;
FWidth := Extend.cx; //大小
FHeight := Extend.cy;
if GrayBmp.Width < Width * Scale then //放大
GrayBmp.Width := Width * Scale;
if GrayBmp.Height < Height * Scale then
GrayBmp.Height := Height * Scale;
GetObject(AAFont.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
with LogFont do
begin
lfHeight := lfHeight * Scale;
lfWidth := lfWidth * Scale;
Beta := lfEscapement * Pi / 1800;
end;
GrayBmp.Canvas.Font.Handle := CreateFontIndirect(LogFont);
GrayBmp.Canvas.Font.Color := clWhite;
FillRect(GrayBmp.Canvas.Handle, Bounds(0, 0, GrayBmp.Width, GrayBmp.Height), 0);
x := Point.x * Scale;
y := Point.y * Scale;
if Beta <> 0 then // 考虑字体旋转
begin
TextSize := TextExtentEx(Text, P);
Inc(x, P.x * Scale);
Inc(y, P.y * Scale);
end;
R := Bounds(0, 0, GrayBmp.Width, GrayBmp.Height);
Windows.TextOut(GrayBmp.Canvas.Handle, x, y, PChar(Text), Length(Text));
BytesLineGray := (GrayBmp.Width + 3) div 4 * 4; //扫描线宽度
BytesLineMask := (Width + 3) div 4 * 4;
ReAllocMem(FpMaskBuff, BytesLineMask * Height);
pS1 := GrayBmp.ScanLine[0]; //源灰度图
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pS4 := PByteArray(Integer(pS3) - BytesLineGray);
pDes := PByteArray(Integer(pMaskBuff) + (Height - 1) * BytesLineMask);
//目标灰度为源矩形块的平均值
case Quality of
aqHigh:
begin //高精度4X4采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 4;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] + pS1^[x + 2] + pS1^[x + 3] +
pS2^[x] + pS2^[x + 1] + pS2^[x + 2] + pS2^[x + 3] +
pS3^[x] + pS3^[x + 1] + pS3^[x + 2] + pS3^[x + 3] +
pS4^[x] + pS4^[x + 1] + pS4^[x + 2] + pS4^[x + 3]) shr 4;
end;
pS1 := PByteArray(Integer(pS4) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pS4 := PByteArray(Integer(pS3) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqNormal:
begin //普通精度3X3采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 3;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] + pS1^[x + 2] shr 1 +
pS2^[x] + pS2^[x + 1] + pS2^[x + 2] +
pS3^[x] shr 1 + pS3^[x + 1] + pS3^[x + 2]) shr 3;
end;
pS1 := PByteArray(Integer(pS3) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pS3 := PByteArray(Integer(pS2) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqLow:
begin //低精度2X2采样
for i := 0 to Height - 1 do
begin
for j := 0 to Width - 1 do
begin
x := j * 2;
pDes^[j] :=
(pS1^[x] + pS1^[x + 1] +
pS2^[x] + pS2^[x + 1]) shr 2;
end;
pS1 := PByteArray(Integer(pS2) - BytesLineGray);
pS2 := PByteArray(Integer(pS1) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
aqNone:
begin //无平滑效果
for i := 0 to Height - 1 do
begin
CopyMemory(pDes, pS1, Width);
pS1 := PByteArray(Integer(pS1) - BytesLineGray);
pDes := PByteArray(Integer(pDes) - BytesLineMask);
end;
end;
end;
FreeGrayBmp;
end;
#38
这个控件包是CnPack的一部分。
#39
晕晕的过去了..........
#40
用TrueType字体~
#41
千万别给前面个发代码的给害了。
我告诉你吧! 除了FixedSys字体,其他字体都可以平滑处理,在GDI中。
FixedSYS字体不能平衡的原因不是不支持,而是这是这个字体的一个特点!
或者这么说,你在系统字体对话框里找到的都可以平滑。
Graphics::SetTextRenderingHint(TextRenderingHintAntiAlias)
记得,当字体尺寸大于12的时候再开抗锯齿,太小了开抗锯齿反而不好!
我告诉你吧! 除了FixedSys字体,其他字体都可以平滑处理,在GDI中。
FixedSYS字体不能平衡的原因不是不支持,而是这是这个字体的一个特点!
或者这么说,你在系统字体对话框里找到的都可以平滑。
Graphics::SetTextRenderingHint(TextRenderingHintAntiAlias)
记得,当字体尺寸大于12的时候再开抗锯齿,太小了开抗锯齿反而不好!
#42
最近也需要处理图形方面的知识,在Directdraw表面画不规则区域,任意增加删除节点构成透明图形,有这类算法吗
#43
另外,给你个经验! 如果有一段源码你想使用! 而不是通过它去学习API的用法。
这段源码包含汗多数学处理。或者行数超过100。只有在两个情况下你可以使用:
1、这段代码已经被网上成千上万的人用过,并且有专门的团队来维护,并且如果你关键词合适,他出现在
google的第一条
2、这段代码来自微软,或者和微软差不多大的公司。
除了上面两个条件,你最好只用你自己的代码!
否则,你就将成为试验品,而那个写代码根本无视你的痛苦,他只会沾沾自喜有人在用他的代码。
这段源码包含汗多数学处理。或者行数超过100。只有在两个情况下你可以使用:
1、这段代码已经被网上成千上万的人用过,并且有专门的团队来维护,并且如果你关键词合适,他出现在
google的第一条
2、这段代码来自微软,或者和微软差不多大的公司。
除了上面两个条件,你最好只用你自己的代码!
否则,你就将成为试验品,而那个写代码根本无视你的痛苦,他只会沾沾自喜有人在用他的代码。
#44
这个DirectX本来就有! 你为什么就不能把SDK里的例子程序全试验一遍再出手!
#45
#46
#47
每天冒泡,挣点分
#48
每天冒泡,挣点分
#49
锯齿都是有的。photoshop也一样,你用放大镜把它的字体放大显示,就明白是怎么回事了。