我们可以在处理中创建部分彩色的文本吗?

时间:2018-08-06 06:50:42

标签: java processing

我想学习在处理(java)中创建部分彩色的文本/字符串,如下例所示。它可以是10%白色90%黑色。或任何两种颜色的任何比率。我想学习如何在处理中做到这一点。

Text Example

1 个答案:

答案 0 :(得分:4)

选项1:处理中

将您的文本呈现到PGraphics对象中,然后遍历该对象的pixel []以更改部分文本的颜色。

在下面的示例中,除非您创建具有文本确切尺寸的PGraphics对象,否则颜色比率将不正确-我不确定是否存在以编程方式确定所需尺寸的方法。 (因此,我使用0.6的比率为示例中文本的顶部〜50%重新着色)。

此外,在对象上调用了 noSmooth(),因为抗锯齿将创建与原始文本颜色不完全相同的像素,这使得替换像素比简单地检查相等性< em>(==)。

import processing.core.PApplet;
import processing.core.PGraphics;

public class Text extends PApplet {

PGraphics text;

public static void main(String[] args) {
    PApplet.main(Text.class);
}

@Override
public void settings() {
    size(400, 400);
}

@Override
public void setup() {
    makeText();
}

@Override
public void draw() {
    background(55);
    image(text, 100, 100);
}

public void makeText() {
    final int orange = color(255,165,0);
    final int yellow = color(255,255,0);
    final float ratio = 0.6f;

    text = createGraphics(150, 60);
    text.noSmooth();
    text.beginDraw();
    text.fill(orange);
    text.textSize(60);
    text.textAlign(LEFT, TOP);
    text.loadPixels();
    text.text("TEXT", 0, 0);
    text.endDraw();

    for (int pixel = 0; pixel < (text.pixels.length * ratio); pixel++) {
        if (text.pixels[pixel] == orange) {
            text.pixels[pixel] = yellow;
        }
    }
}
}

结果:

enter image description here


选项2:使用JavaFX

这是一种骇人听闻的方法,但是由于文本经过了抗锯齿处理,因此效果更好。此方法要求您的草图处于FX2D渲染模式,可以在size()调用中指定。

暴露属于PApplet的stackPane(这是将在其中添加JavaFX文本对象的地方):

Canvas canvas = (Canvas) ((PSurfaceFX) getSurface()).getNative();
StackPane p = (StackPane) canvas.getParent();

创建一个JavaFX文本对象。我正在使用CSS样式(具有立即截止的线性渐变)来实现部分着色的效果。

javafx.scene.text.Text t = new javafx.scene.text.Text("TEXT");
t.setCache(true);
t.setFont(Font.font(null, FontWeight.NORMAL, 60));
t.setStyle("-fx-fill:linear-gradient( from 100.0% 100.0% to 100.0% 0.0%, rgb(255, 165, 0) 0.5," + "rgb(255, 255, 0)" +" 0.5);");

最后,将文本添加到PApplet的阶段堆栈窗格(前面已公开):

p.getChildren().add(t);

结果(注意抗锯齿):

enter image description here

还请注意,由于此文本元素与Processing的绘图画布完全分开,因此您将需要使用t.setVisible()来切换可见性。