大海捞针 Skia(C++) 第 3 期:绘制文本

Skia绘图教程 详细的介绍了Skia基本绘图操作,有示例,有说明 立即下载

前言

本期将正式给大家介绍Skia的使用。文章将涉及一个目的的多种方案多种情况。文章较长,请大家耐心阅读。

关键词:PNG图像、文件、文本、字符串、UTF8、UTF16、UTF32、编码转换、Visual Studio 设置、高级保存选项


案例

注意:接下来的案例都将使用PNG图像来存储查看绘制结果

Visual Studio 应将代码文件默认编码设置为UTF-8(建议不带BOM,即标准UTF8编码,操作教程如下:
Visual Studio 设置默认编码格式为 UTF-8 或 GB2312-80 与文件没有高级保存选项怎么显示

这里的常字符串不是专业术语,这里表达的意思是,代码中的字符串以及常量字符串。例如,我们在给一个string类付初始值时即会使用一个字符串例如"Hello, Skia!",这样的字符串是固定的,因为代码中就是这样。因此编译的程序里也一定默认这样初始化。至于常量字符串,则是指const char*。

绘制代码中字符串步骤和上一期绘制"Hello, Skia!"一致,这里将详细介绍。
在绘制前,应确保你的Visual Studio项目已经配置好Skia库,具体步骤参考《大海捞针 Skia(C++) 第 1 期:Skia 环境搭建》。


绘制图像,就像画画一样,我们需要一个介质来存储我们的笔画痕迹。因而在Skia中,我们使用SkBitmap作为这个介质。

实例化一个SkBitmap:

SkBitmap bitmap;

好比绘画所用的纸也有规格参数,同样,上述这个介质也需要。用于描述这个参数的类叫做SkImageInfo。
我们可以通过如下方式,手动指定规格信息,但值得注意的是,生活中,绘画纸的参数是用于描述纸的,而在这里,参数是用于生成纸的,详情将在后面指出。这里,我们创建了一个信息块,同时为其填写信息,即:宽600px、高400px、RGBA颜色,同时设置使用Alpha通道。

SkImageInfo bitmapInfo = SkImageInfo::Make(600, 400, kRGBA_8888_SkColorType, kPremul_SkAlphaType);

接下来我们需要用这个信息分配空间。

bitmap.allocPixels(bitmapInfo);

接下来就是看起来不能理解但很合理的部分。bitmap作为我们绘制的介质我们却无法直接对其进行绘制,而提供一个SkCanvas供我们绘制。虽然显得有些繁琐,但其实却很合理。bitmap仅作为我们存储的地方。而SkCanvas作为绘制的部分。好比GUI程序界面与其内部数据是分离的,但却不可割舍其中一个。同理,绘制也是如此。SkCanvas并不存储数据,但却提供给我们绘制的方法;而SkBitmap不提供绘制方法,却允许我们将图像数据存储其中。这自然是很合理的。
那如何使用SkCanvas呢?首先,我们知道SkCanvas是不存储数据的,但提供绘制方法,那我们调用方法绘制时数据存何处?自然是SkBitmap,因此,我们需要为SkCanvas绑定一个存储数据的地方——SkBitmap。如下:

SkCanvas canvas(bitmap);

既然SkCanvas为我们提供了绘制的方法,那么,我们想要达成绘制字符串的目的,自然需要调用其中的方法。
这里有两个方法可以使用。
第一种,使用drawSimpleText方法;
第二种,使用drawString方法。
我相信大家也许去尝试使用这两个方法,然而发现这两个方法有许多参数。不急,我们慢慢解析。

第一种方法原型如下:

void drawSimpleText(const void *text, size_t byteLength, SkTextEncoding encoding,
  SkScalar x, SkScalar y, const SkFont &font, 
  SkPaint &paint);

text:待绘制的字符串
byteLength:字符串字节数
encoding:字符串编码
x:起点横坐标
y:起点纵坐标
font:字体
paint:画笔

绘制文本,自然需要我们给出字符串,那如何表示呢?std::string?实际上我们可以使用Skia提供的SkString类存储字符串。这里我们将定义两个字符串,分别用于两种绘制方法。

SkString str_Method1("Drawed by drawSimpleText"),
  str_Method2("Drawed by drawString");

第一个参数是字符串指针,我们只需调用SkString的c_str方法即可。第二个参数我们同样只需调用SkString的size方法即可。第三个参数,因为我们已经设置代码文件编码为UTF8,因此我们只需设置编码为SkTextEncoding::kUTF8。第四五个参数,我们分别传入绘制起始点的坐标。第六个参数是字体。第七个参数是画笔。

不难发现,这一个方法就带了一堆参数。于是又扯到了字体和画笔上。
接下来,我们将对第六七个参数进行详解。

首先,我们先了解一下字体类——SkFont。
顾名思义,这个类自然是对字体的设置。实例化一个对象不必多言,但我们如何初始化呢?
方法如下:

SkFont font(SkTypeface::MakeFromName("Consolas", SkFontStyle::Bold()), 20);

这里我们选择使用Consolas字体,同时设置风格为加粗,大小为20。

接下来就是画笔SkPaint了,其实字面上看,倒不如说是绘画更为贴切,但Skia使用“Paint”这个名字用来储存绘制动作的属性(包括颜色、透明度等),我们即将其叫做更为熟知的“画笔”。

SkPaint paint;
paint.setColor(SkColor(0xFF000000));

万事俱备,只欠东风。现在我们只需要调用drawSimpleText方法即可。

canvas.drawSimpleText(str_Method1.c_str(), str_Method1.size(), SkTextEncoding::kUTF8, 0, 20, font, paint);

至于drawString方法,原型如下:

void drawString(const SkString &str, SkScalar x, SkScalar y, const SkFont& font,
  const SkPaint& paint);

看到原型,相比大家已经知道如何使用了。这里不过多解释。

接下来就是输出为PNG图片了。原理很简单,我们只需声明一个文件输出流,然后使用SkEncodeImage函数编码即可。

SkFILEWStream stream("D:/test.png");
SkEncodeImage(&stream, bitmap, SkEncodedImageFormat::kPNG, 100);

值得注意的是,第四个参数是一个0-100的整数,用来表示图片质量,100为最大,并且,这个参数只会对jpeg和webp格式生效。


参考代码

#include "pch.h"

int main()
{
	SkBitmap bitmap;
	SkImageInfo bitmapInfo = SkImageInfo::Make(600, 400, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
	bitmap.allocPixels(bitmapInfo);
	SkCanvas canvas(bitmap);
	canvas.clear(0xFFFFFFFF); //注意,这里是ARGB,Alpha通道值在前

	SkString str_Method1("Drawed by drawSimpleText"),
		str_Method2("Drawed by drawString");

	SkFont font(SkTypeface::MakeFromName("Consolas", SkFontStyle::Bold()), 20);
	SkPaint paint;
	paint.setColor(SkColor(0xFF000000)); //同上
	canvas.drawSimpleText(str_Method1.c_str(), str_Method1.size(), SkTextEncoding::kUTF8, 0, 20, font, paint);
	canvas.drawString(str_Method2, 0, 50, font, paint);
	SkFILEWStream stream("D:/test.png");
	SkEncodeImage(&stream, bitmap, SkEncodedImageFormat::kPNG, 100);

	return 0;
}
skui:基于Skia的C ++ UI框架 立即下载

相关推荐

skia for windows 静态库

用vs2015编译的skia静态链接库,release模式 64位

Skia简介以及在Windows下编译操作步骤

Skia是一个C++的开源2D向量图形处理函数库(Cairo是一个矢量库),包括字型、坐标转换、位图等等,相当于轻量级的Cairo,目前主要用于Google的Android和Chrome平台,Skia搭配OpenGL/ES与特定的硬件特征,强化显示的效果。另外,Skia是WebKit支持的众多图形平台之一,在WebKit的GraphicsContext.h/.c中有相关实现。 Android与C...

网络资源是无限的 1万+

OpenAI Codex 桌面端国内使用全坑解決指南(2026 Windows 实测)

本地文件报错:SQLite 初始化失败、启动闪退、卡加载页 → 本地缓存/数据库损坏,和网络无关网络地区报错→ 网络IP/地区被拦截,和本地软件文件无关Codex 桌面端的大部分报错,都不是软件故障,而是海外软件适配国内网络、国内模型协议不兼容导致的适配问题。不用盲目重装、换网络、改系统设置,只要区分「本地文件问题」和「网络地区问题」,搭配国内大模型 API 替代方案,就能完美解决所有痛点。(注:部分内容可能由 AI 生成)

ups_hxc的博客 1094

skia入门例子(在vs中怎么创建一个skia例子),傻瓜式说明,简单易懂

这次之前需要编译过skia,怎么编译可以看https://blog.youkuaiyun.com/weixin_42001089/article/details/80320424接下来就一步步看看进行吧:打开vs,新建工程如下:文件名和位置可以自行选择接着点击下一步在跳出的框中选择应用台控制点击完成,生成结果应该如下:接下来就是要将skia 一些头文件添加进来了,这些头文件在skia/include,如我的具...

爱吃火锅的博客 1万+

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 724

深入解析CAN2.0A与CAN2.0B协议:帧格式与通信机制对比

本文深入对比了CAN2.0A与CAN2.0B协议的核心差异,重点解析了11位标准帧与29位扩展帧的帧格式、标识符长度及通信机制。文章阐述了CAN2.0B向下兼容的特性,并探讨了在汽车电子、工业控制等复杂网络中,如何根据项目需求、兼容性及实时性要求,在标准帧与扩展帧之间做出合理选择。

weixin_29163797的博客 394

大海捞针 Skia(C++) 第 4 期:绘制基本图形

本期将为大家介绍基本图形的画法,包括:圆、椭圆、矩形、圆角矩形。

AquerKing的博客 1105

5分钟搞定DataDome滑块验证码:最新Capsolver API实战教程(含代理配置)

本文提供了一份利用Capsolver API快速自动化破解DataDome滑块验证码的实战教程。文章深入剖析了DataDome验证码的环境指纹与行为分析机制,并重点详解了确保成功率的住宅代理配置、API集成步骤及令牌使用等核心环节,帮助开发者高效集成稳定可靠的自动化解决方案。

milk8的博客 494

大海捞针 Skia(C++) 第 2 期:“Hello, Skia!”

本期将带领大家完成最经典的程序——“Hello, Skia!图形库表现方式主要以图像为主,因此,我们将会以图像的形式完成第一个项目。

AquerKing的博客 1102

STM32F103RC学习(一)

STM32F103RC学习(一)

Cat_South_North的博客 6057

HFSS与AI融合:智能算法如何重塑天线设计流程

本文探讨了HFSS与AI融合如何通过智能算法革新天线设计流程。在5G/6G通信时代,AI技术如机器学习和遗传算法显著提升了高频电磁场仿真效率,将传统设计周期从数周缩短至数小时,并优化了天线性能。文章详细介绍了AI与HFSS的集成策略、关键技术突破及典型应用案例,展示了智能算法在天线设计中的巨大潜力。

weixin_29035147的博客 777

Skia 2D图形库使用教程

Skia 是一个开源的2D图形库,提供了跨多种硬件和软件平台的通用API。它作为图形引擎服务于Google Chrome、ChromeOS、Android、Flutter等多个产品。Skia 由Google赞助和管理,但任何人都可以在BSD自由软件许可证下使用。 ## 项目快速启动 ### 环境准备 在开始之前,确保你的开发环境已经安装了必要的构建工具,如CMake、Ninja等。 ###...

gitblog_00769的博客 1537

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

【亲测免费】 Skia 项目使用教程

Skia 是一个开源的 2D 图形库,提供了跨多种硬件和软件平台的通用 API。以下是 Skia 项目的基本目录结构及其介绍: ``` skia/ ├── docs/ # 文档目录,包含用户文档、API 参考等 ├── include/ # 头文件目录,包含 Skia 库的公共头文件 ├── modules/ # 模块...

gitblog_00951的博客 766

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9926

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大海捞针 Skia(C++) 第 1 期:Skia 环境搭建

C++使用Skia前的准备

AquerKing的博客 1938

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【亲测免费】 Skia 开源项目使用教程

Skia 是一个功能强大的 2D 图形库,其 GitHub 仓库的目录结构如下: ``` skia/ ├── bazel/ ├── bench/ ├── bin/ ├── BUILD.bazel ├── canvas/ ├── ci/ ├── CMakeLists.txt ├── common/ ├── compiler/ ├── config/ ├── docs/ ├── example/ ├...

gitblog_00375的博客 717

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Skia图形引擎安装与配置完全指南

Skia是一个由Google维护的高性能、开放源代码的二维图形库,它使用C++编写,旨在跨不同的硬件和软件平台提供一致的图形渲染能力。广泛应用于Google Chrome、Chrome OS、Android、Flutter等重量级产品中。Skia通过抽象不同平台的图形API,简化了跨平台应用程序开发中的图形处理流程。 ## 关键技术和框架 Skia的核心特性包括但不限于高级2D绘图命令的支持,文...

gitblog_07822的博客 1128

【亲测免费】 Skia图形库中文使用手册

**Skia** 是一个强大的2D图形处理库,它支持跨不同硬件和软件平台的图形绘制,被广泛应用于Google Chrome、Chrome OS、Android、Flutter等重量级产品中。本手册旨在为开发者提供详尽的指导,从安装到应用,全方位解析Skia,助您快速上手。 --- ### 安装指南 #### 环境需求 确保您的开发环境已配置了C++编译器以及Git工具。 #### 步骤一:...

gitblog_01277的博客 2158

Claude Code Action迁移指南:从v0.x到v1.0的完整步骤与注意事项 [特殊字符]

**Claude Code Action迁移**是每个使用AI代码助手的开发者都需要了解的重要过程。随着v1.0版本的发布,这个强大的GitHub Action工具带来了更智能的自动模式检测和简化的配置体验。如果你正在使用v0.x版本,这份**完整迁移指南**将帮助你顺利完成**GitHub Action升级**,享受新版带来的便利和效率提升。 ## 🎯 v1.0版本的核心改进 ### 智能

gitblog_00035的博客 758

Skia 编译及踩坑实践

在宿主链接 libskia.so 阶段,出现各种 ld: error: undefined symbol: SkCanvas::drawXXX,在宿主运行阶段,使用 SkData、SkImage、 SkFont 等,出现各种指针异常导致的闪退,不要怀疑自己,果断换分支,Main 是开发分支,不是稳定分支,就算是稳定分支,也不代表真的稳定!OpenGL 比较人性化,开箱即用,就像一辆跑车,已经将骨架都搭好,我们只需往里面换个轮子,换个色漆,换个尾灯,随便配置,都可以是法拉利。也是国内大厂自渲染首选图形库。

京东科技开发者 2833

Skia深入分析8——Skia的GPU绘图

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33734785的博客 1096

如何快速上手Skia:2025年最完整的2D图形库入门指南

**Skia** 是一个功能强大的2D图形处理库,支持文本、几何图形和图像的绘制,被广泛应用于Google Chrome、Android和Flutter等主流平台。本文将带你从安装到实战,轻松掌握这个跨平台图形引擎的核心用法! ## ???? 为什么选择Skia?3大核心优势解析 Skia作为业界领先的2D图形库,具备以下无可替代的优势: - **跨平台兼容性**:完美支持Windows、mac...

gitblog_00059的博客 1033

Skia深入分析4——skia路径绘制的实现

Skia路径绘制代码分析 路径绘制尽管使用频率相对于图像绘制、文本绘制低,但却是非常重要的一个基本特性。所有不规则图形(椭圆、圆角矩形、三角形、简单的文字),最后都避不开路径绘制。 而且,若自己实现一个2D引擎,这块内容是很具有参考意义的,用OpenGL的话,图像采样等都很少关注了,对对坐标就好。但菱角、圆弧、曲线等如何绘制仍然是一个难题,这时就可以参...

weixin_33985507的博客 1145

2311skia,本地惊心动魄的编译skia的x86版本

本地惊心动魄的编译skia的x86版本

个人进步之路 1829

Skia 项目使用教程

Skia 项目使用教程 项目介绍 Skia 是一个开源的 2D 图形库,提供跨多种硬件和软件平台的通用 API。它是 Google Chrome、ChromeOS、Android、Flutter 等产品的图形引擎。Skia 由 Google 赞助和管理,但任何人都可以在 BSD 自由软件许可证下使用。 项目快速启动 环境准备 首先,确保你的开发环境已经安装了 Git 和 CMake。 克隆项目 g...

gitblog_00393的博客 1229
上一篇: 2023 项目探秘:从零开始编译Asepirte
下一篇: 节外生枝 - Minecraft Fabric Mod 开发:第 1 期 开发环境与准备
AquerKing
博客等级 码龄7年 8粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值