Qt图标字体文件中提取字体保存为图片

本文借用别人写的一个IconHelper来做说明。

1. 加载一个字体文件

cpp 复制代码
 QScopedPointer<IconHelper> iconHelper(
        new IconHelper(":/fa-regular-400.ttf", "Font Awesome 6 Pro Regular"));

构造函数

cpp 复制代码
IconHelper::IconHelper(const QString &fontFile, const QString &fontName,
                       QObject *parent)
    : QObject(parent) {
    // 判断图形字体是否存在,不存在则加入
    //  QFontDatabase fontDb;
    if (!QFontDatabase::families().contains(fontName) &&
        QFile(fontFile).exists()) {
        int fontId = QFontDatabase::addApplicationFont(fontFile);
        QStringList listName = QFontDatabase::applicationFontFamilies(fontId);
        if (listName.count() == 0) {
            qDebug() << QString("load %1 error").arg(fontName);
        }
    }

    // 再次判断是否包含字体名称防止加载失败
    if (QFontDatabase::families().contains(fontName)) {
        iconFont = QFont(fontName);
#if (QT_VERSION >= QT_VERSION_CHECK(4, 8, 0))
        iconFont.setHintingPreference(QFont::PreferNoHinting);
#endif
    }
}

在资源文件中绑定一个字体,然后初始化这个IconHelper, 它将会检查系统字体库,并添加到字体库中。

最后找到这个字体,留存备用。

2. 从字体的编号保存到图片

cpp 复制代码
struct FontImageCode {
    int code;
    QString name;
};

void MainWindow::SaveFontImages() {
    QScopedPointer<IconHelper> iconHelper(
        new IconHelper(":/fa-regular-400.ttf", "Font Awesome 6 Pro Regular"));

    QString color("#F08784");
    QString fileExt(".png");
    int fontSize = 600;
    int imageWidth = 600;
    int imageHeight = 600;

    QList<FontImageCode> images{
        {0xf01d, "circle-play"},
        {0x23f8, "pause"},
    };

    for (auto &f : images) {
        QPixmap pix = iconHelper->getPixmap1(color, f.code, fontSize,
                                             imageWidth, imageHeight);
        QImage img = pix.toImage();
        img.save(f.name + fileExt);
    }
}

字体颜色,字体尺寸,图片尺寸都可以指定的。

运行查看结果

3. 如何生成图片

cpp 复制代码
QPixmap IconHelper::getPixmap1(const QColor &color, int icon, quint32 size,
                               quint32 width, quint32 height, int flags) {
    // 主动绘制图形字体到图片
    QPixmap pix(width, height);
    pix.fill(Qt::transparent); // 用透明色填充

    QPainter painter;
    painter.begin(&pix); // 需要先调用 begin() 函数来初始化 QPainter
                         // 对象。这会告诉 QPainter 要在哪个设备上进行绘制。
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.setPen(color);

    iconFont.setPixelSize(size);
    painter.setFont(iconFont);
    painter.drawText(pix.rect(), flags, (QChar)icon);
    painter.end(); // 在每次使用完 QPainter 进行绘制后,应该调用 end()
                   // 函数来释放资源,并确保正确地结束绘图操作。
    return pix;
}

先建立一张图片,用透明色填充。

在这图片上建立画笔,设置画笔颜色,再设置成这个字体,最后画上文本。

画文本的时候,填写字体编号就行了。

4. ttf字体预览

Iconfont Preview (luckly-mjw.cn) 这个网站很好用的。

5. Font Awesome Pro 6.5.1 字体下载

找到了专业版付费字体,里面包含图标很多。分享下载吧

链接:https://pan.baidu.com/s/1yZcaPPVX4OcaJ5iK7uZtOQ?pwd=x3pq

提取码:x3pq

--来自百度网盘超级会员V8的分享

6. 本文源码

Image/Font2Image · 沁明/QtDemo - 码云 - 开源中国 (gitee.com)

相关推荐
ylfhpy10 分钟前
Python常见面试题的详解16
开发语言·python·面试
handsomestWei11 分钟前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
不能只会打代码14 分钟前
六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战
前端·html·html5
宝哥的菜鸟之路21 分钟前
Python 数据分析概述 ①
开发语言·python·数据分析
全栈若城22 分钟前
03 Python字符串与基础操作详解
java·开发语言·python
OpenTiny社区31 分钟前
Node.js技术原理分析系列——Node.js的perf_hooks模块作用和用法
前端·node.js
伯牙碎琴32 分钟前
二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)
java·spring·log4j
菲力蒲LY35 分钟前
输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
java·前端·mybatis
南宫生1 小时前
力扣每日一题【算法学习day.130】
java·学习·算法·leetcode
!!!5251 小时前
Java实现斗地主-做牌以及对牌排序
java·算法