内容简介
本期将带领大家完成最经典的程序——“Hello, Skia!”。图形库表现方式主要以图像为主,因此,我们将会以图像的形式完成第一个项目。
关键词:文字、PNG图像、文件流
具体操作
1. 预编译头与静态库配置
打开Visual Studio,新建控制台项目(Console Project),添加预编译头(Precompiled Header)。
在你的预编译头文件(默认为pch.h)中添加对应头文件。
本期我们需要的头文件如下:
#ifndef PCH_H
#define PCH_H
// Skia
#include <include/core/SkCanvas.h>
#include <include/core/SkBitmap.h>
#include <include/core/SkPaint.h>
#include <include/core/SkTypeface.h>
#include <include/core/SkFont.h>
#include <include/codec/SkCodec.h>
#include <include/core/SkImageEncoder.h>
// Skia Depency
// Skia依赖于Direct的一些库,按照如下复制即可
#include <d3d12.h>
#pragma comment(lib, "D3D12.lib")
#include <d3dcompiler.h>
#pragma comment(lib, "d3dcompiler.lib")
#pragma comment(lib, "Opengl32.lib")
#ifdef _DEBUG
#include <dxgi1_3.h>
#pragma comment(lib, "DXGI.lib")
#endif // _DEBUG
// C++
#include <Windows.h>
#endif //PCH_H
接着,在项目管理中,链接静态库skia.lib
。
2. 编写代码
代码如下:
#include "pch.h"
#include <iostream>
int main()
{
SkBitmap bitmap; //创建一个位图设备
SkImageInfo imageInfo = SkImageInfo::Make(480, 320, kBGRA_8888_SkColorType, kPremul_SkAlphaType); //设置位图信息
bitmap.allocPixels(imageInfo, imageInfo.minRowBytes()); //为位图设备绑定信息和分配内存
SkCanvas canvas(bitmap); //创建画布
SkPaint paint; //创建画笔
canvas.clear(SkColorSetARGB(0xFF, 0x14, 0x14, 0x14));
//将画布清空并填充一种颜色,注意这里是ARGB,Alpha通道值在第一位,同时可以直接用16进制数表示,例如上面这个颜色值可以表示为0xFF141414
paint.setColor(SK_ColorWHITE);
//设置画笔颜色
SkFont font; //创建字体设备
font.setSize(64); //设置字体尺寸
font.setTypeface(SkTypeface::MakeFromName("Microsoft YaHei", SkFontStyle::Normal())); //设置字体
SkString text("Hello, Skia!");
canvas.drawSimpleText(text.c_str(), text.size(), SkTextEncoding::kUTF8, 0, 64, font, paint); //在画布上绘制字体
SkFILEWStream stream("D:\\test.png"); //创建文件输出流
SkEncodeImage(&stream, bitmap, SkEncodedImageFormat::kPNG, 100); //将位图数据按照指定格式编码并输出到文件中
return 0;
}
在此,值得注意的是,我们使用SkCanvas
的drawSimpleText
方法进行绘制,其中第三个参数是字符串的编码,这里使用的Skia版本仅支持四种编码。在进行绘制时,一定保证字符串编码与所选择编码一致。这里作者的Visual Studio
默认使用标准UTF-8
(不带BOM)编码,若未进行编码设置,则可能默认为GB2312
,在绘制前需转换为UTF-8
编码。
在完成上述操作后,我们将会在D盘下获得一张图片,内容如下。