главная продукты downloads форум тех. поддержка

 

Главная страница

GDI+ FAQ: Text Effects

 

Many applications require text effects such as those offered by CorelDraw, Word and PhotoShop. While there are no methods specifically designed to produce these effects in one operation, GDI+ can be used to create them by aggregating several layers of text into one image.

 

A classic example of this is the alpha blended drop shadow as shown in another GDI+ FAQ article. Other examples include embossed or distorted text. This article will show you how to create some of he more popular ones.

Embossed and chiseled text.

This is one of the most effective text drawing methods and produces a nice 3D bas relief image. To produce this effect, the text is drawn several times in different places. For example, a lightly embossed effect will be seen by drawing the same string three time in a light colour at an offset of -1,-1, in a dark color at offset +1,+1 and in the normal text color at offset 0,0. Like so many 2D graphics tricks, the technique works by leading the eye to believe that something is a certain way. Windows programs always suggest that light is shining from the top-left of the screen. We can take advantage of this and maintain illusion for text output as shown in figure 1.

 

Figure 1.

 

The colours used to create the edges must be carefully chosen to contrast correctly with the background and the final text colour. The offset used should also be carefully adjusted. Small offsets for small fonts and proportionally larger offsets for larger font heights.

 

The code that produced the effect shown in Figure 1 is shown in Listing 1.

 

Listing 1.

 

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

  Font fn = new Font("Times New Roman",50);

  string s="Embossed Text";

  e.Graphics.DrawString(s,fn,Brushes.White,28,28,StringFormat.GenericTypographic);

  e.Graphics.DrawString(s,fn,Brushes.DarkGray,32,32,StringFormat.GenericTypographic);

  e.Graphics.DrawString(s,fn,Brushes.Black,30,30,StringFormat.GenericTypographic);

  s="Chiseled Text";

  e.Graphics.DrawString(s,fn,Brushes.DarkGray,28,108,StringFormat.GenericTypographic);

  e.Graphics.DrawString(s,fn,Brushes.LightGray,32,112,StringFormat.GenericTypographic);

  e.Graphics.DrawString(s,fn,Brushes.SeaShell,30,110,StringFormat.GenericTypographic);

  fn.Dispose();

}

Outline text.

 

The outline from any shape can be stroked with a pen after being placed into a GraphicsPath object. The Graphics.DrawPath method is provided for this purpose. Figure 2 shows both hollow and filled outline text.

 

Figure 2.

 

Listing 2 shows how this effect was obtained.

 

Listing 2.

 

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{           

  //create a path

  GraphicsPath pth = new GraphicsPath();

  //Add a string               

  pth.AddString("Outline Text.",

      new FontFamily("Times New Roman"),0,70,

      new Point(30,30), StringFormat.GenericTypographic);

  //Select the pen             

  Pen p=new Pen(Color.Blue,2.0f);

  //draw te hollow outlined text

  e.Graphics.DrawPath(p,pth);

  //clear the path

  pth.Reset();

  //Add new text

  pth.AddString("Filled outline Text.",

      new FontFamily("Times New Roman"),0,70,

      new Point(30,120),StringFormat.GenericTypographic);

  //Fill it

  e.Graphics.FillPath(Brushes.Red,pth);

  //outline it

  e.Graphics.DrawPath(p,pth);

  //tidy up.

  p.Dispose();

  pth.Dispose();

}

Warped text

Effects such as perspective or a distortion similar to that seen on the "A long time ago in a galaxy far away..." titles of Star Wars can be achieved using the GraphicsPath.Warp method.

 

The Warp takes an array of three or four points that define a parallelogram or non regular quadrilateral.  Where three points are used, a fourth is implied for you.

 

Figure 3 shows a GraphicsPath object containing text that has been warped to fit a window and provide a perspective view of the character glyphs.

 

Figure 3.

 

Listing 3 shows how this effect was accomplished.

 

Listing 3.

 

private void Form1_Paint(object sender, PaintEventArgs e)

{           

  //create a path

  GraphicsPath pth = new GraphicsPath();

  string s = "Bob Powell's GDI+ FAQ ";

  FontFamily ff=new FontFamily("Verdana");

  //Add the text strings

  for(int y=0;y<5;y++)

  {

    pth.AddString(s,ff,0,70,new Point(0,90*y), StringFormat.GenericTypographic);

  }

  //Create the warp array

  PointF[] points=new PointF[]{

  new PointF(this.ClientSize.Width/2-this.ClientSize.Width/4,0),

  new PointF(this.ClientSize.Width/2+this.ClientSize.Width/4,0),

  new PointF(0,this.ClientSize.Height),

  new PointF(this.ClientSize.Width,this.ClientSize.Height)

  };

  //Warp the path

  pth.Warp(points,new RectangleF(0,0,820,450));

  //Fill the background

  e.Graphics.FillRectangle(Brushes.Black,this.ClientRectangle);

  //Paint the warped path by filling it

  e.Graphics.FillPath(Brushes.Yellow,pth);

  pth.Dispose();

}

 

Obviously, graphics in a GraphicsPath object will also be distorted by this process so you can freely mix text and graphical outline shapes in the same warp.

 

Back to the GDI+ FAQ

 

e-mail:

 

bousoft@mail.ru