我询问两件事。首先,我有一个ttf文件,它位于我的macair驱动器中。我不想将该文件添加到我的项目结构中。如何从中导入True_type字体。我尝试了各种方法将其导入我的Java程序。例如,公共类TextFixer{
私有静态字符串[]名称 = { " iksswgrg.ttf " }; //这存在于我的macair驱动器上,我想从它创建字体。
private static Map<String, Font> cache = new ConcurrentHashMap<String, Font>(names.length);
static {
for (String name : names) {
cache.put(name, getFont(name));
}
}
public static Font getFont(String name) {
Font font = null;
if (cache != null) {
if ((font = cache.get(name)) != null) {
return font;
}
}
String fName = "/fonts/" + name;
try {
InputStream is = TextFixer.class.getResourceAsStream(fName);
font = new Font("ttf", 0, 16);
//font = Font.createFont(Font.TRUETYPE_FONT, is);
} catch (Exception ex) {
ex.printStackTrace();
System.err.println(fName + " not loaded. Using serif font.");
font = new Font("serif", Font.PLAIN, 24);
}
return font;
}
第二部分是我想使用图形创建一个字符串。首先,我需要有130mm的宽度。显示框的高度将是提供的字符串中最高的字符。字体大小在8到16之间。我有一个企业项目来处理ttf的高度和大小。我面临的问题是:我不想使用摆动/javafx库。我想使用Java的图形库,使用Graphics2D有一个矩形。如何将其宽度精确设置为130mm?然后我想根据字体使宽度灵活。我想画一个字符串,字符串应该在提供的宽度上得到调整/灵活。我可以通过g.drawString()画一个字符串,但我在控制台上看不到它。因为我不想使用Jframe或任何Swing/javaFX库。我知道这似乎有点长,但我希望我已经解释得足够好。我迫切需要帮助。请告诉我,如果你们能在这里帮助我。提前感谢
首先,我有一个ttf文件,它位于我的macair驱动器中。我不想将该文件添加到我的项目结构中。如何从中导入True_type字体
这更多的是与“如何在文件系统上引用文件”和“如何加载字体”有关的问题,因为如果您能解决第一个问题,您就可以解决第二个问题。
File fontFile = new File("some/relative/path/to/your/Font.tff");
或
File fontFile = new File("/some/absolute/path/to/your/Font.tff");
就个人而言,我两者都不喜欢,因为这会带来太多麻烦(工作目录、其他系统等),我更喜欢在可能的情况下使用嵌入式资源或将文件放在公共位置。
例如,在Windows或Mac上,您可以使用{code>{user.home}/AppData/Local/{application name},然后无论从何处执行程序
加载字体相对简单。例如,我将字体文件放在程序的工作目录中
System.out.println(new File("Pacifico.ttf").exists());
Font font = Font.createFont(Font.TRUETYPE_FONT, new File("Pacifico.ttf"));
第二部分是我想使用图形创建一个字符串。首先,我需要有130mm的宽度。显示框的高度将是提供的字符串中最高的字符
这要复杂得多,因为图像是以像素为单位测量的。为了知道给定距离有多少像素,我们需要知道图像的DPI。
其72DPI
好的,那么,我们可以计算出我们需要的像素数
public static double cmToPixel(double cm, double dpi) {
return (dpi / 2.54) * cm;
}
130mm(13 cm)为368.503937007874。
从这里,我们需要找到一段给定文本的字体大小,以适应这个范围。
现在,有很多种方法可以做到这一点,你只需从点1开始,然后执行一个线性级数,直到通过你所追求的范围。它不是很快,而且随着大小的增加,它可能会变得有点容易出错。
我选择了更多的分而治之的方法
protected static int widthOfText(String text, Font font, float fontSize, Graphics2D g2d) {
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
return textWidth;
}
public static Float pointToFit(double width, String text, Font font, Graphics2D g2d, float min, float max) {
float fontSize = min + ((max - min) / 2f);
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
if (fontSize == min || fontSize == max) {
return fontSize;
}
if (textWidth < width) {
return pointToFit(width, text, font, g2d, fontSize, max);
} else if (textWidth > width) {
return pointToFit(width, text, font, g2d, min, fontSize);
}
return fontSize;
}
重要的是要注意,它不是完美的,但它比线性级数更好:P
有了这个,我们可以开始计算所需的属性。。。
String text = "Happy, Happy, Joy, Joy";
double width = cmToPixel(13.0, 72.0);
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
float fontSize = pointToFit(width, text, font, g2d, 0, (float)width);
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int height = fm.getHeight();
g2d.dispose();
好的,这会创建一个小的(1x1)临时图像。我们需要图形上下文来计算所有其他属性。然后计算字体点大小,从中可以计算文本高度
有了所有这些信息,我们可以着手实际渲染文本。。。
img = new BufferedImage((int) Math.round(width), height, BufferedImage.TYPE_INT_ARGB);
g2d = img.createGraphics();
g2d.setFont(font);
fm = g2d.getFontMetrics();
g2d.html" target="_blank">setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
最终会输出这样的结果。。。
在渲染文本之前,我添加了红色边框,这样我可以看到它有多合适。
现在,这是一个非常基本的示例,它没有告诉您文本何时不适合(即,点大小为1或0),您必须自己设置陷阱才能捕捉到
而且,因为我知道你可能会有很多乐趣把它放在一起,我的测试代码。。。
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) {
try {
System.out.println(new File("Pacifico.ttf").exists());
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font font = Font.createFont(Font.TRUETYPE_FONT, new File("Pacifico.ttf"));
String text = "Happy, Happy, Joy, Joy";
double width = cmToPixel(13.0, 72.0);
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
float fontSize = pointToFit(width, text, font, g2d, 0, (float) width);
System.out.println(width);
System.out.println(fontSize);
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int height = fm.getHeight();
g2d.dispose();
img = new BufferedImage((int) Math.round(width), height, BufferedImage.TYPE_INT_ARGB);
g2d = img.createGraphics();
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, img.getWidth() - 1, img.getHeight() - 1);
g2d.setFont(font);
fm = g2d.getFontMetrics();
g2d.setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
JOptionPane.showConfirmDialog(null, new ImageIcon(img));
} catch (IOException | FontFormatException e) {
//Handle exception
}
}
public static Float pointToFit(double width, String text, Font font, Graphics2D g2d) {
return pointToFit(width, text, font, g2d, 0f, Float.MAX_VALUE);
}
protected static int widthOfText(String text, Font font, float fontSize, Graphics2D g2d) {
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
return textWidth;
}
public static Float pointToFit(double width, String text, Font font, Graphics2D g2d, float min, float max) {
float fontSize = min + ((max - min) / 2f);
NumberFormat nf = NumberFormat.getInstance();
font = font.deriveFont(fontSize);
FontMetrics fm = g2d.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
if (fontSize == min || fontSize == max) {
return fontSize;
}
if (textWidth < width) {
return pointToFit(width, text, font, g2d, fontSize, max);
} else if (textWidth > width) {
return pointToFit(width, text, font, g2d, min, fontSize);
}
return fontSize;
}
public static double cmToPixel(double cm, double dpi) {
return (dpi / 2.54) * cm;
}
}
问题内容: 这是我的Resources.class中的一种方法: 我的程序的结构是: 这是不起作用的代码片段: 当我打开PDF时,文本在那里,但是使用了一些字体(我猜是默认字体)。 注意1:我尝试将字体设置为仅短语(p)和仅段落(pa),但这丝毫没有改变输出。 注意2:Resource.loadFont(“ wingding”); try / catch方法没有“捕获”任何错误。 问题答案: 尝试
问题内容: 我的代码有问题。因为我要为页面包括全局字体,所以我下载了.ttf文件。我将其包含在我的主要CSS中,但是我的字体不会改变。 这是我的简单代码: 我不知道我哪里出了错。你能帮我吗?谢谢。 问题答案: 仅为webfont提供.ttf文件不足以支持跨浏览器。目前最好的组合是使用以下组合: 此代码假定您的webfont具有.eot,.woff,.ttf和svg格式。要使所有这些过程自动化,您可
问题内容: 我想使用JavaScript计算字符串的宽度。是否可以不必使用等宽字体? 如果不是内置的,我唯一的想法就是为每个字符创建一个宽度表,但这是非常不合理的,特别是支持Unicode和不同类型的大小(以及与此相关的所有浏览器)。 问题答案: 创建具有以下样式的DIV。在JavaScript中,设置要测量的字体大小和属性,将字符串放入DIV中,然后读取DIV的当前宽度和高度。它将拉伸以适合内容
问题内容: 我有一台Mac,并且安装了一种名为“ 7 Segment”的字体(它显示在Font Book中)。当我使用Helvetica(或类似字体)而不是浏览器的默认字体时,它仍然没有显示正确的字体。该页面仅需要在此计算机上显示。我将如何使用此页面上的字体?谢谢。 问题答案: 您需要使用css-property font-face来声明您的字体。 例:
我正在尝试使用 SDL2 TTF 和 OpenGL 显示文本。窗口中出现了一个奇怪的纹理,它有正确的大小和正确的位置,但你看不到任何字母。 我尝试过使用SDL_CreateRGBSurface(),认为这可能是一种更干净的方式来恢复像素,但它也不起作用。我的表面从不为空,并且总是通过验证测试。 我在 while() 循环之前使用 get_front() 函数,在使用 glClear(GL_COLO
问题内容: 在我的系统上,我需要注册两个外部字体.TTF文件: 在创建Font()对象之前,我使用以下命令进行记录: 然后创建对象(由于格式不同,我创建了多个Font()): 好的,系统正常工作。问题在于,运行后,.TTF文件会更改大小(分别为83 KB和80 KB),从而: 然后,当我第二次运行系统时,发生以下错误: 如果我将更改后的大小(83 KB和80 KB)的.TTF文件替换为原始文件(7