Obtener métricas de fuentes
La clase FontFamily proporciona los métodos siguientes que recuperan diversas métricas para una combinación de familia y estilo concreta:
- GetEmHeight(FontStyle)
- GetCellAscent(FontStyle)
- GetCellDescent(FontStyle)
- GetLineSpacing(FontStyle)
Los números que devuelven estos métodos están en unidades de diseño de fuente, de modo que son independientes del tamaño y de las unidades de un objeto Font concreto.
En la siguiente ilustración se muestran las distintas métricas.
En el ejemplo siguiente se muestran las métricas del estilo normal de la familia de fuentes Arial. El código también crea un objeto Font (basado en la familia Arial) con un tamaño de 16 píxeles y muestra las métricas (en píxeles) de ese objeto Font concreto.
Dim infoString As String = "" ' enough space for one line of output
Dim ascent As Integer ' font family ascent in design units
Dim ascentPixel As Single ' ascent converted to pixels
Dim descent As Integer ' font family descent in design units
Dim descentPixel As Single ' descent converted to pixels
Dim lineSpacing As Integer ' font family line spacing in design units
Dim lineSpacingPixel As Single ' line spacing converted to pixels
Dim fontFamily As New FontFamily("Arial")
Dim font As New Font( _
fontFamily, _
16, _
FontStyle.Regular, _
GraphicsUnit.Pixel)
Dim pointF As New PointF(10, 10)
Dim solidBrush As New SolidBrush(Color.Black)
' Display the font size in pixels.
infoString = "font.Size returns " + font.Size + "."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)
' Move down one line.
pointF.Y += font.Height
' Display the font family em height in design units.
infoString = "fontFamily.GetEmHeight() returns " + _
fontFamily.GetEmHeight(FontStyle.Regular) + "."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)
' Move down two lines.
pointF.Y += 2 * font.Height
' Display the ascent in design units and pixels.
ascent = fontFamily.GetCellAscent(FontStyle.Regular)
' 14.484375 = 16.0 * 1854 / 2048
ascentPixel = _
font.Size * ascent / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The ascent is " + ascent + " design units, " + ascentPixel _
+ " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)
' Move down one line.
pointF.Y += font.Height
' Display the descent in design units and pixels.
descent = fontFamily.GetCellDescent(FontStyle.Regular)
' 3.390625 = 16.0 * 434 / 2048
descentPixel = _
font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The descent is " + descent + " design units, " + _
descentPixel + " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)
' Move down one line.
pointF.Y += font.Height
' Display the line spacing in design units and pixels.
lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular)
' 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel = _
font.Size * lineSpacing / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The line spacing is " + lineSpacing + " design units, " + _
lineSpacingPixel + " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)
[C#]
string infoString = ""; // enough space for one line of output
int ascent; // font family ascent in design units
float ascentPixel; // ascent converted to pixels
int descent; // font family descent in design units
float descentPixel; // descent converted to pixels
int lineSpacing; // font family line spacing in design units
float lineSpacingPixel; // line spacing converted to pixels
FontFamily fontFamily = new FontFamily("Arial");
Font font = new Font(
fontFamily,
16, FontStyle.Regular,
GraphicsUnit.Pixel);
PointF pointF = new PointF(10, 10);
SolidBrush solidBrush = new SolidBrush(Color.Black);
// Display the font size in pixels.
infoString = "font.Size returns " + font.Size + ".";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
// Move down one line.
pointF.Y += font.Height;
// Display the font family em height in design units.
infoString = "fontFamily.GetEmHeight() returns " +
fontFamily.GetEmHeight(FontStyle.Regular) + ".";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
// Move down two lines.
pointF.Y += 2 * font.Height;
// Display the ascent in design units and pixels.
ascent = fontFamily.GetCellAscent(FontStyle.Regular);
// 14.484375 = 16.0 * 1854 / 2048
ascentPixel =
font.Size * ascent / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The ascent is " + ascent + " design units, " + ascentPixel +
" pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
// Move down one line.
pointF.Y += font.Height;
// Display the descent in design units and pixels.
descent = fontFamily.GetCellDescent(FontStyle.Regular);
// 3.390625 = 16.0 * 434 / 2048
descentPixel =
font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The descent is " + descent + " design units, " +
descentPixel + " pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
// Move down one line.
pointF.Y += font.Height;
// Display the line spacing in design units and pixels.
lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular);
// 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel =
font.Size * lineSpacing / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The line spacing is " + lineSpacing + " design units, " +
lineSpacingPixel + " pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
En la siguiente ilustración se muestra el resultado del código anterior.
Observe las dos primeras líneas del resultado en la ilustración anterior. El objeto Font devuelve un tamaño de 16 y el objeto FontFamily devuelve un alto de Em de 2.048. Estos dos números (16 y 2.048) son la clave para convertir unidades de diseño de fuente a las unidades (en este caso, píxeles) del objeto Font.
Por ejemplo, se puede convertir el ascenso de unidades de diseño a píxeles de la siguiente manera:
En el código anterior se sitúa el texto verticalmente estableciendo el dato miembro Y de un objeto PointF. La coordenada y se incrementa en font.Height
en cada nueva línea de texto. La propiedad Height de un objeto Font devuelve el interlineado (en píxeles) de ese objeto Font concreto. En este ejemplo, el número que devuelve Height es 19. Observe que es el mismo número (redondeado a un entero) que el que se obtiene al convertir la métrica del interlineado a píxeles.
Observe que el alto Em (también llamado tamaño o tamaño Em) no es la suma del ascenso y del descenso. La suma del ascenso y del descenso se denomina alto de celda. El alto de la celda menos el espacio interno es igual al alto Em. El alto de la celda más el espacio externo es igual al interlineado.