大海捞针 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万+

phpstudy自定义安装mysql8.3并启动

下载压缩包文件然后按下面的图片一步一步操作选择版本,选择第一个压缩包文件,下载下载完成后,解压到phpstudy环境目录下

互联网碎碎念 2802

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

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

爱吃火锅的博客 1万+

Docker安装Nacos(详细教程)

Docker安装Nacos的步骤相对直接,但需要注意一些细节以确保安装成功。

weixin_73060959的博客 1405

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

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

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

AquerKing的博客 1105

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2474

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

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

AquerKing的博客 1102

【数字孪生与仿真技术】05:从原理到实战:MATLAB/Simulink在航空航天GNC系统开发中的深度解析(含全流程代码与认证指南)

摘要:本文系统阐述MATLAB/Simulink在航空航天制导、导航与控制(GNC)系统开发中的核心应用。通过解析GNC系统高保真动力学建模、多源导航传感器融合、鲁棒控制算法设计等关键技术原理,结合Virgin Orbit运载火箭、CubeSat等真实案例,展示从需求分析、模型搭建、仿真验证到代码生成与认证的完整开发流程。文中提供1200余行关键代码、8个可复用Simulink模型及详细执行结果展示,涵盖DO-178C认证支持、实时性能优化等工业级开发规范,为航空航天工程师、科研人员提供可落地的参考方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1656

基于AUTOSAR的汽车电子项目--电动助力转向系统

基于AUTOSAR的汽车电子项目开发通常涵盖广泛的领域,例如动力系统控制、车身电子、信息娱乐系统、高级驾驶辅助系统(ADAS)等。以下是一个简化的示例项目,展示了如何在AUTOSAR环境下开发一个电动助力转向系统(Electric Power Steering, EPS)的控制软件

MHD0815的博客 2129

Skia 2D图形库使用教程

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

gitblog_00769的博客 1537

SAP 打印输出中 `#` 字符替代日文汉字的根本原因与全面解决方案

只要认清设备类型 / 字符集 / 字体三角关系,并合理利用PDFUCSWINCF或 UPE + URDT,LP01里那些恼人的就会彻底消失,日文汉字将在纸面与 PDF 中如预览一样完美呈现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 814

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

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

gitblog_00951的博客 766

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 303

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

C++使用Skia前的准备

AquerKing的博客 1938

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

gitblog_00375的博客 717

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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、付费专栏及课程。

余额充值