JavaFx 使用字体图标记录

原文:JavaFx 使用字体图标记录 – Stars-One的杂货小窝

之前其实也是研究过关于字体图标的使用,还整了个库Tornadofx学习笔记(4)——IconTextFx开源库,整合5000+个字体图标 – Stars-one – 博客园

由于之前并不是太过于讲解字体图标,最近又是抽空研究了一番

介绍

字体图标在JavaFx中的Label控件和Text控件进行使用,使用字体图标的好处:

  • 可以不用每次都需要图标的时候去拷贝图片到项目
  • 可以通过样式直接更改字体颜色从而实现更改图标颜色

提供字体图标的网站有很多,比如阿里的iconfont-阿里巴巴矢量图标库

比如另外的Remix Icon Remix Icon – Open source icon library,里面的基础图标很全,推荐大家可以集成一下,ttf文件大小不到400KB

我们以阿里巴巴矢量图标库来说明下使用方法

使用

1.下载图标文件

使用github账号登录一下阿里巴巴矢量图标库,之后选择我们需要的图标,添加到购物车

注意: 字体图标选用纯色的比较好

JavaFx 使用字体图标记录

之后点击购物车,可以查看自己选择的图标,选择添加到项目(如果没有项目,可以在之后弹窗中新建项目)

JavaFx 使用字体图标记录

之后可以查看我们的项目,从顶头的导航菜单进来(资源管理->我的项目),选择下载到本地

JavaFx 使用字体图标记录

之后你会得到一个压缩包,解压如下所示

JavaFx 使用字体图标记录

可以看到有个简单的html文件,这个文件我们可以打开,是用来预览图标,如下所示

JavaFx 使用字体图标记录

除此之外,我们还可以看到json文件,里面的内容实际上就是关于各图标的名称,unicode等数据,之后我们可以用到此份json文件

ttf文件则是我们需要的字体文件,需要复制到我们项目中进行使用

2.代码中使用

我们将ttf文件复制到项目中,该如何使用呢?下面我按照两种语言进行简单说明

Java

//读取字体文件,第二个参数是字体大小
Font font = Font.loadFont(getClass().getResourceAsStream("/ttf/icon.ttf"), 20.0);
//某个图标的unicode
char unicode = '\ue001';
Text text = new Text();
//设置字体和文字
text.setFont(font);
text.setText(Character.toString(unicode));
//这里根据情况输入填写,主要就是修改颜色和字体
text.setStyle("-fx-font-size:20px;-fx-fill:red;");

上述代码中,unicode数据是怎么来的呢?各位通过html文件应该就能明白了,图标下面有所标明,我们需要把 #$x给替换成了 \u即可

JavaFx 使用字体图标记录

注意上面,我们的unicode是char类型的,在设置的时候使用了此方法 Character.toString(unicode),将其转为了String类型,我们暂且将此结果称为unicode字体数据

实际上,我们直接打印出来使不会有任何显示的,因为我们当前系统没有此unicode对应的字体

但是,实际上,我们一般都是直接获取到一个String对象而不是一个char类型,如 String s = "\\ue001",

PS:双斜杠是因为需要转义,实际上变量s的内容为 \ue001

上面的变量s不是unicode字体数据,该如何转换呢?

这里,可以使用 commons-text 库中的 StringEscapeUtils 工具类进行转换

首先,是引用maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
<dependency>
    <groupid>org.apache.commons</groupid>
    <artifactid>commons-text</artifactid>
    <version>1.9</version>
</dependency>
  • StringEscapeUtils.unescapeJava() 将unicode形式的字符串转为unicode字体数据
  • StringEscapeUtils.escapeJava() 将unicode字体数据转为unicode形式的字符串,中文其实也算做unicode字体数据, 如中文的”我”得到的返回结果为 \u6211 或者可以复制一些特殊表情也可以进行转换哦

使用如下代码所示:

//读取字体文件,第二个参数是字体大小
Font font = Font.loadFont(getClass().getResourceAsStream("/ttf/iconfont.ttf"), 20.0);
//某个图标的unicode
String unicode = "\\ue001";
Text text = new Text();
//设置字体和文字
text.setFont(font);
text.setText(StringEscapeUtils.unescapeJava(unicode));
//这里根据情况输入填写,主要就是修改颜色和字体
text.setStyle("-fx-font-size:20px;-fx-fill:red;");

Kotlin

在Kotlin中,和Java不同,我们可以直接把char类型当成字符串String类型,如下代码所示:

text {
    //第二个参数是字体大小
    font = loadFont("/font/iconfont.ttf", 25.0)!!

    //如果只有一个\,在Kotlin中就是字体数据
    text ="\ueDEF"
    style {
        fill = c("red")
    }
}

但是如果我们是动态读入的一个unicode数据,则是没法使用的,原因和上述说的一样,因为不是unicode字体数据,所以text控件会什么都不显示

text {
    font = loadFont("/font/iconfont.ttf", 25.0)!!

    //两个斜杠,需要调用方法转为unicode字体数据
    text = StringEscapeUtils.unescapeJava("\\ueDEF")
    style {
        fill = c("red")
    }
}

补充

最后,上述也是提到了,我们解压出来的字体目录下有一份json文件,实际上,我们可以将此份json数据也放在项目文件夹里

在应用运行开始的时候读取,构建一个Map

之后我们需要用到的时候,可以直接根据名称从中拿去unicode字体数据直接显示

参考

Original: https://www.cnblogs.com/stars-one/p/16793359.html
Author: Stars-one
Title: JavaFx 使用字体图标记录



相关阅读

Title: 降维算法实战项目(2)—使用PCA对图像降维(Python代码+数据集)

在这部分练习中,我们将学习人脸图像上运行PCA,看看如何在实践中使用它来减少维度。

老规矩,先放出数据集:

链接:https://pan.baidu.com/s/1R0oiqoWHV2iR8sc3YHkMoA
提取码:6666

导入需要用到的包

from numpy import *
from scipy.io import loadmat
import matplotlib.pyplot as plt

导入数据

faces_data = loadmat('data/ex7faces.mat')
print(faces_data)
X=faces_data['X']
print(X.shape)

结果为:

{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Mon Nov 14 23:46:35 2011', '__version__': '1.0', '__globals__': [], 'X': array([[ -37.86631387,  -45.86631387,  -53.86631387, ..., -110.86631387,
        -111.86631387,  -99.86631387],
       [   8.13368613,   -0.86631387,   -8.86631387, ...,  -34.86631387,
          -8.86631387,    0.13368613],
       [ -32.86631387,  -34.86631387,  -36.86631387, ..., -110.86631387,
        -111.86631387, -111.86631387],
       ...,
       [ -46.86631387,  -24.86631387,   -8.86631387, ...,   90.13368613,
          80.13368613,   59.13368613],
       [  19.13368613,   16.13368613,   14.13368613, ...,  -38.86631387,
         -41.86631387,  -46.86631387],
       [-108.86631387, -106.86631387, -102.86631387, ...,   17.13368613,
          17.13368613,   18.13368613]])}
(5000, 1024)

说明我们的数据集有5000个样本,每个样本有1024个特征。

可视化

我们可视化一下前100张人脸图像:

def plot_100_image(X):
    fig,ax=plt.subplots(nrows=10,ncols=10,figsize=(10,10))
    for c in range(10):
        for r in range(10):
            ax[c,r].imshow(X[10*c+r].reshape(32,32).T,cmap='Greys_r')
            ax[c,r].set_xticks([])
            ax[c,r].set_yticks([])
    plt.show()

plot_100_image(X)

结果如下图所示:

JavaFx 使用字体图标记录
接下来我们应用PCA算法的步骤与之前在二维数据集上的步骤一致:
1.去均值化

2.计算协方差矩阵

3.计算特征值和特征向量

我们不再细致讲解,有需要的可以看我之前的博客:

https://blog.csdn.net/wzk4869/article/details/126074158?spm=1001.2014.3001.5502

直接放出对应的代码:

def reduce_mean(X):
    X_reduce_mean=X-X.mean(axis=0)
    return X_reduce_mean
X_reduce_mean=reduce_mean(X)

def sigma_matrix(X_reduce_mean):
    sigma=(X_reduce_mean.T @ X_reduce_mean)/X_reduce_mean.shape[0]
    return sigma
sigma=sigma_matrix(X_reduce_mean)

def usv(sigma):
    u,s,v=linalg.svd(sigma)
    return u,s,v
u,s,v=usv(sigma)
print(u)

def project_data(X_reduce_mean, u, k):
    u_reduced = u[:,:k]
    z=dot(X_reduce_mean, u_reduced)
    return z
z = project_data(X_reduce_mean, u, 100)

我们接下来还原数据,这里选择只保留100个特征:

def recover_data(z, u, k):
    u_reduced = u[:,:k]
    X_recover=dot(z, u_reduced.T)
    return X_recover
X_recover=recover_data(z,u,100)

我们看一下最后降维后的图像:

plot_100_image(X_recover)

JavaFx 使用字体图标记录
我们对比两张图片,可以很明显的看出,第二张图片保留的特征较少,已经导致脸部有些模糊。

最后唠叨一句

如果不设置 cmap='Greys_r' 会很阴间:

最开始的100张人脸:

JavaFx 使用字体图标记录
降维后的人脸:
JavaFx 使用字体图标记录

Original: https://blog.csdn.net/wzk4869/article/details/126078119
Author: 旅途中的宽~
Title: 降维算法实战项目(2)—使用PCA对图像降维(Python代码+数据集)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/363484/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总