来自字符串的CreateFont()

时间:2018-10-15 14:25:37

标签: java processing

可以在Processing或Java中创建一个自身包含String格式的排版(ttf或otf)的变量,以便能够像使用图像一样加载它,因为LoadImage()从整数数组工作。 我可以用图片来做对于排版,有什么办法吗? 谢谢!

mysql> SELECT * FROM country ORDER BY 'avg-GNP' DESC LIMIT 5;
+------+-------------+---------------+---------------------------+--------+-------------------+------------+--------------+---------+----------------------------------------------+
| code | fullname    | continent     | region                    | area   | year-independence | population | avg-lifespan | avg-GNP | form-government                              |
+------+-------------+---------------+---------------------------+--------+-------------------+------------+--------------+---------+----------------------------------------------+
| ABW  | Aruba       | North America | Caribbean                 |    193 |                 0 |     103000 |        78.40 |  828.00 | Nonmetropolitan Territory of The Netherlands |
| AFG  | Afghanistan | Asia          | Southern and Central Asia | 652090 |              1919 |   22720000 |        45.90 | 5976.00 | Islamic Emirate                              |
| AGO  | Angola      | Africa        | Central Africa            | 124670 |              1975 |   12878000 |        38.30 | 6648.00 | Republic                                     |
| AIA  | Anguilla    | North America | Caribbean                 |     96 |                 0 |       8000 |        76.10 |   63.20 | Dependent Territory of the UK                |
| ALB  | Albania     | Europe        | Southern Europe           |  28748 |              1912 |    3401200 |        71.60 | 3205.00 | Republic                                     |
+------+-------------+---------------+---------------------------+--------+-------------------+------------+--------------+---------+----------------------------------------------+
5 rows in set (0.00 sec)

ps:返回2像素的PImage。我的PFont也需要同样的东西。

2 个答案:

答案 0 :(得分:0)

在“处理”编辑器中,转到“ 工具>创建字体.. ”以创建.vlw文件(Processing的字体格式),然后在代码中只需使用loadFont()而不是{{1} }

CreateFont tool preview

请务必根据正确的字体大小和字符(特别是如果使用特殊字符)运行一些测试。在渲染文本方面,根据渲染器的不同,Processing可以使用textMode()进行位图或形状。

此外,如果您需要创建文本的图像/像素,则可以使用PGraphics(扩展了createFont()

更新 仍不清楚您在问什么:

  • 从字符串(字体文件名)加载字体?
  • 将文本渲染为图像吗?
  • 获取字体中的所有字形作为像素?还有其他东西吗?

如果您想将文本呈现到图像,如上所述,可以使用PGraphics:

PImage

text rendered to image

有关PFont的更多详细信息,请使用PFont javadoc。 请注意,您可以get glyphswhich have images):

noSmooth();

PGraphics textImage = createGraphics(25,25);
textImage.beginDraw();
textImage.text("O!",10,15);
textImage.endDraw();

image(textImage,0,0);
image(textImage,0,0,textImage.width * 2.1,textImage.height * 2.1);
image(textImage,0,0,textImage.width * 4.5,textImage.height * 4.5);

PFont glyph images font 1

PFont glyph images font 2

此外,您还可以通过PFont的String[] fontNames = {"Monospaced","ProcessingSansPro-Regular"}; int NUM_FONTS = fontNames.length; PFont[] fonts = new PFont[NUM_FONTS]; PFont font; int FONT_SIZE = 30; String message = "Hello World"; ArrayList<PImage> glyphImages; void setup(){ size(300,300); textAlign(CENTER); fill(0); // load fonts for(int i = 0 ; i < NUM_FONTS; i++){ fonts[i] = createFont(fontNames[i],FONT_SIZE); } // set first font setFont(0); } void draw(){ background(255); text(message,width * 0.5,height * 0.5); drawGlyphImages(); } void keyPressed(){ if(key == '1'){ setFont(0); } if(key == '2'){ setFont(1); } } void setFont(int fontIndex){ // check font data is accessible if(fonts != null){ if(fontIndex >= 0 && fontIndex < fonts.length){ // update global reference to currently set font font = fonts[fontIndex]; // tell Processing to use this font textFont(font,FONT_SIZE); // create glyph images glyphImages = getGlyphImages(font,message); }else{ println("error: invalid array index",fontIndex,"valid range is",0,fonts.length-1); } }else{ println("error: null fonts array"); } } ArrayList<PImage> getGlyphImages(PFont font,String message){ ArrayList<PImage> result = new ArrayList<PImage>(); // access font glyph images for(int i = 0 ; i < message.length(); i++){ // get the each character char currentChar = message.charAt(i); // get the glyph PFont.Glyph glyph = font.getGlyph(currentChar); // if there is a glyph (space or other special character might not be encoded in the font file) if(glyph != null){ // get a copy of the glyph image PImage glyphImage = glyph.image.get(); // glyph PImages are in ALPHA format: for demo purposes we use a GRAY filter to set the format to RGB glyphImage.filter(GRAY); // append the glyph image to the list result.add(glyphImage); } } return result; } ArrayList<PShape> getGlyphShapes(PFont font,String message){ ArrayList<PShape> result = new ArrayList<PShape>(); // access font glyph images for(int i = 0 ; i < message.length(); i++){ // get the each character char currentChar = message.charAt(i); // get the glyph shape PShape glyphShape = font.getShape(currentChar); // if there is a glyph (space or other special character might not be encoded in the font file) if(glyphShape != null){ // add the shape to the list result.add(glyphShape); } } return result; } void drawGlyphImages(){ float previousGlyphsHeight = 0; for(int i = 0; i < glyphImages.size(); i++){ PImage glyphImage = glyphImages.get(i); image(glyphImage,10,glyphImage.height + previousGlyphsHeight,glyphImage.width * 2,glyphImage.height * 2); previousGlyphsHeight += (glyphImage.height * 2) + 3; } } 获取形状:

[getShape()][9]

PFont glyph shapes font 1

PFont glyph shapes font 2

如果要绘制自己的字形,则可以始终使用beginShape()createShape()等,并将其包装在一个函数中,该函数接受要渲染的字符串并为每个字符串绘制正确的形状字符。

如果要创建自己的ttf字体文件,则可能需要一个外部库。 看看Typography Processing libraries的扩展功能。

答案 1 :(得分:0)

没有办法采取一些相当粗暴的黑客手段来做到这一点。

如果您感到好奇,可以通过首先使用乔治的答案创建.vlw字体来解决此问题。然后,您需要编写一个实用程序,将文件的字节作为字节数组读入,然后输出一些语法,以便将其存储为变量。将变量复制到目标草图中,然后可以使用ByteArrayInputStream将字节传递到采用PFont的{​​{1}}构造函数中。

因此可以确定,可能。但这是非常棘手的,您绝对不应该尝试这样做。

相反,我鼓励您退后一步,仔细考虑您要做什么。听起来您正在尝试从处理中导出单个InputStream文件。请注意,即使您使用上述技巧摆脱了字体文件,这也是不可能的!

处理将自身导出为运行脚本和.exe文件的目录。它不是不是单个打包的可执行文件。要将您的Processing草图转换为.jar文件,您将必须使用Launch4J或JWrapper之类的东西。

请注意,这些类型的应用程序均支持打包外部文件,这是处理字体文件的方式。

还请注意,您可以将字体存储在Web上,然后将URL传递到.exe函数中。但是同样,您仍然必须处理Processing导出的多个loadFont()文件。