Java的哪个字体API返回正确的宽度?我们目前使用
font.getStringBounds( "the string", frc ).getWidth();
这会在图像和显示上返回正确的值。但是使用 Java SE 6 打印是错误的。使用 Java 7 一切都是正确的。差异非常小。但是我们在一行的末尾丢失了一个“i”。我们在打印时收到完全相同的值。但是文本需要更多的空间在打印图形上。
我们使用反别名和分数指标。
我知道有不同的 API。但是推荐的 API 是什么?
Java的哪个字体API返回正确的宽度?我们目前使用
font.getStringBounds( "the string", frc ).getWidth();
这会在图像和显示上返回正确的值。但是使用 Java SE 6 打印是错误的。使用 Java 7 一切都是正确的。差异非常小。但是我们在一行的末尾丢失了一个“i”。我们在打印时收到完全相同的值。但是文本需要更多的空间在打印图形上。
我们使用反别名和分数指标。
我知道有不同的 API。但是推荐的 API 是什么?
你有打印机的图形对象吗?如果您测试此代码,在这种情况下会发生什么?这是我用来测量宽度的:
/*
Graphics2D g
Font currentFont
String stringToMeasure
*/
FontMetrics currentFontMetrics = g.getFontMetrics(currentFont);
Rectangle2D stringBounds = currentFontMetrics.getStringBounds(stringToMeasure, g);
double width = stringBounds.getWidth();
默认情况下,Java 会舍入所有字体指标,因为它假定您正在尝试渲染到屏幕,您需要扩展 FontRenderContext 并打开 FractionalMetricsHint ,如下所示。然后,使用它来传递字体渲染上下文。
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
public class MyFontRenderContext extends FontRenderContext {
public MyFontRenderContext()
{
}
@Override
public AffineTransform getTransform()
{
return new AffineTransform();
}
/* (non-Javadoc)
* @see java.awt.font.FontRenderContext#usesFractionalMetrics()
*/
@Override
public boolean usesFractionalMetrics()
{
return true;
}
/* (non-Javadoc)
* @see java.awt.font.FontRenderContext#getFractionalMetricsHint()
*/
@Override
public Object getFractionalMetricsHint()
{
// TODO Auto-generated method stub
return RenderingHints.VALUE_FRACTIONALMETRICS_ON;
}
/* (non-Javadoc)
* @see java.awt.font.FontRenderContext#getAntiAliasingHint()
*/
@Override
public Object getAntiAliasingHint()
{
return RenderingHints.VALUE_ANTIALIAS_ON;
}
/* (non-Javadoc)
* @see java.awt.font.FontRenderContext#isAntiAliased()
*/
@Override
public boolean isAntiAliased()
{
return true;
}
}
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class FontMetricsReader
{
public static void main(String[] args)
{
Font f = new Font("Frutiger55Roman", java.awt.Font.PLAIN, 6);
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
FontMetrics metrics = g.getFontMetrics(f);
String str = "The quick brown fox jumps over the lazy dog";
System.out.println("Rounded text width = " + metrics.stringWidth(str));
System.out.println("Accurate text width = " + f.getStringBounds(str, new MyFontRenderContext()).getWidth());
}
}
TextLayout
可能是最通用的方法。可以在此处的问题和答案中找到一些相关示例: