当字体放大时,字的图边缘部分不平滑有很多锯齿,我在photoshop中看他的RGB通道也都有锯齿,但是他的alpha通道很平滑,有没有处理的方法,使得文字平滑? GDI+我试过,效果也不行。这样的算法如何实现?

解决方案 »

  1.   

    普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
    点阵字体:http://baike.baidu.com/view/1941516.htm
    TrueType:http://baike.baidu.com/view/333247.htm
      

  2.   

    自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
      

  3.   

    如果是点阵字体平滑算法也没用。想要大小都平滑就用TrueType。
    如果非用点阵,就用TrueType字体生成点阵字体。
      

  4.   

    最初,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也可改装。
    ==============================================================================
    这些字体我都试了,效果还是那样。程序要做成能随便设置字体的。搞了好久了,头疼。
      

  5.   

    http://topic.csdn.net/t/20020902/19/990592.html,大家可以看看这个帖子。
      

  6.   

    平滑特效字体控件包AAFont,这个里有相关算法,可惜是delphi写的
      

  7.   

    看看微软官方网站truetype字体的文档吧,数据中存储的也是点阵字体,不过经过复杂算法读出后就成平滑的了
      

  8.   

    GDI+ 的文字平滑肯定是可以满足你要求的!
    首先,你要平滑的字体做什么!
    如果你连 Adobe 和 微软 的效果都看不上,你是不会找到更好的结果的。
    不知道你是真的看不上,还是压根就没用对!别折腾了,就Adobe和GDI+选一个了。 
    你自己找算法是在搞笑!或者说,你只是想搞一会算法玩一玩!
      

  9.   

    自己找算法不可行, 楼主还是用GDI+吧, 现在图形奇点算法都没完全解决呢,别说锯齿问题了,你的显示器的原理本身就是点阵的.
      

  10.   

    Adobe的效果很好,但是GDI+效果不太好(可能是我不太会用,有demo的兄弟能否给我看看?)。以前的一种做法是把字体放大,然后做平滑处理,然后再缩小字体。不知道哪位兄弟有好的办法。
      

  11.   

    GDI本身就支持插值的方式平滑字体,不是必须用GDI+。插值方式很简单,在有锯齿的地方填充DC背景色和相邻颜色的平均值,离字形越近的插值越接近字体色,离字形越远的插值越接近背景色。这种方式有个缺点,DC必须有背景色,如果设置透明,默认取黑色作为背景色,如果你把DC中绘制出的字形数据抠出来贴到白色或浅色背景的其它位图或DC中,就可以看到字体有明显的黑边,没办法,这是插值算法需要的背景色跟目标背景色不同造成的。
      

  12.   

    普通的点阵字体是不行的,放大有锯齿。要文字平滑,需要使用TrueType字体。
    点阵字体:http://baike.baidu.com/view/1941516.htm
    TrueType:http://baike.baidu.com/view/333247.htm
      

  13.   

    自己搞算法吗?这个感觉太高深,从来没看到过这方面的具体展示,只在传说中如果只为了显示没锯齿,那如楼上所言,你只要挑TrueType字体就没问题,window会自动处理。
      

  14.   

    看看微软官方网站truetype字体的文档吧
      

  15.   

    这套控件是用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;
      

  16.   

    这个控件包是CnPack的一部分。
      

  17.   

                   用TrueType字体~
      

  18.   

    千万别给前面个发代码的给害了。 我告诉你吧! 除了FixedSys字体,其他字体都可以平滑处理,在GDI中。
    FixedSYS字体不能平衡的原因不是不支持,而是这是这个字体的一个特点!
    或者这么说,你在系统字体对话框里找到的都可以平滑。Graphics::SetTextRenderingHint(TextRenderingHintAntiAlias)记得,当字体尺寸大于12的时候再开抗锯齿,太小了开抗锯齿反而不好!
      

  19.   

    最近也需要处理图形方面的知识,在Directdraw表面画不规则区域,任意增加删除节点构成透明图形,有这类算法吗
      

  20.   

    另外,给你个经验! 如果有一段源码你想使用! 而不是通过它去学习API的用法。
    这段源码包含汗多数学处理。或者行数超过100。只有在两个情况下你可以使用:1、这段代码已经被网上成千上万的人用过,并且有专门的团队来维护,并且如果你关键词合适,他出现在  
       google的第一条2、这段代码来自微软,或者和微软差不多大的公司。除了上面两个条件,你最好只用你自己的代码!否则,你就将成为试验品,而那个写代码根本无视你的痛苦,他只会沾沾自喜有人在用他的代码。
      

  21.   


    这个DirectX本来就有! 你为什么就不能把SDK里的例子程序全试验一遍再出手!
      

  22.   

    锯齿都是有的。photoshop也一样,你用放大镜把它的字体放大显示,就明白是怎么回事了。
      

  23.   

    看来开SetTextRenderingHint平滑字体还是要用GDI+不可,.net程序每次开机后的第一次运行要编译,这个会阻止vc开发者转向.net,并且受管理的代码被限制的很厉害,性能比较低.
    好像vc代码能直接编译为.net app把
      

  24.   

    去用FreeType库吧,字体渲染技术现在做得好的就是Adobe,Apple,MS,开源当中能使用的的就是FreeType,但是效果就比前面三家要稍差些,自己观察,但是很多游戏当中都有使用的,例如魔兽世界。FreeType可以把TrueType自的反走样(抗锯齿)字体的通道给提取出来,用来渲染字串,现在Linux,Android的字体渲染就是用的FreeType。若要算法,就自己去研究吧
      

  25.   

    顶~
    大连网站制作www.dlsnail.com大连网站制作 
      

  26.   

    自己搞Font太麻烦了,不仅要处理TTF、OpenFont等格式,而且有嵌入点阵等很多麻烦的事情。
    实际上Photoshop也是调用的GDI,不过它是先在一个内存DC上画一个大一倍的字体,然后用二次插值缩小。
    不过Windows本身的字体引擎比较烂,加上宋体是嵌入点阵的,无法ClearType,对于小字号字体会比较难看。
    这方面Mac OS X和Linux做得都比较好。如果是特别需要,可以用FreeType库。
      

  27.   

    汉字识别算法有源码
    http://www.topnetsecurity.com/viewthread.php?tid=301&extra=page%3D2
      

  28.   

    我是在做一个类似于字幕的东西。我的做法是:在DC上写字,保存成一个tga文件。现在的问题是透明通道问题。RGB可以有锯齿,但是通道平滑就可以了。有哪位兄弟做过相关的东西吗?
      

  29.   

    我写过电视字幕软件,可以提供SDK