可以在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也需要同样的东西。
答案 0 :(得分:0)
在“处理”编辑器中,转到“ 工具>创建字体.. ”以创建.vlw文件(Processing的字体格式),然后在代码中只需使用loadFont()而不是{{1} }
请务必根据正确的字体大小和字符(特别是如果使用特殊字符)运行一些测试。在渲染文本方面,根据渲染器的不同,Processing可以使用textMode()进行位图或形状。
此外,如果您需要创建文本的图像/像素,则可以使用PGraphics(扩展了createFont()
)
更新 仍不清楚您在问什么:
如果您想将文本呈现到图像,如上所述,可以使用PGraphics:
PImage
有关PFont的更多详细信息,请使用PFont javadoc。 请注意,您可以get glyphs(which 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的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]
如果要绘制自己的字形,则可以始终使用beginShape(),createShape()等,并将其包装在一个函数中,该函数接受要渲染的字符串并为每个字符串绘制正确的形状字符。
如果要创建自己的ttf字体文件,则可能需要一个外部库。 看看Typography Processing libraries的扩展功能。
答案 1 :(得分:0)
没有办法采取一些相当粗暴的黑客手段来做到这一点。
如果您感到好奇,可以通过首先使用乔治的答案创建.vlw
字体来解决此问题。然后,您需要编写一个实用程序,将文件的字节作为字节数组读入,然后输出一些语法,以便将其存储为变量。将变量复制到目标草图中,然后可以使用ByteArrayInputStream
将字节传递到采用PFont
的{{1}}构造函数中。
因此可以确定,可能。但这是非常棘手的,您绝对不应该尝试这样做。
相反,我鼓励您退后一步,仔细考虑您要做什么。听起来您正在尝试从处理中导出单个InputStream
文件。请注意,即使您使用上述技巧摆脱了字体文件,这也是不可能的!
处理将自身导出为运行脚本和.exe
文件的目录。它不是不是单个打包的可执行文件。要将您的Processing草图转换为.jar
文件,您将必须使用Launch4J或JWrapper之类的东西。
请注意,这些类型的应用程序均支持打包外部文件,这是处理字体文件的方式。
还请注意,您可以将字体存储在Web上,然后将URL传递到.exe
函数中。但是同样,您仍然必须处理Processing导出的多个loadFont()
文件。