解决使用Skia图形库时遇到的几个问题
Skia是一个开源的2D图形库,提供通用的API,适用于工作中遇到的各种硬件和软件平台。这是谷歌浏览器Chrome OS,Android的图形引擎,Mozilla Firefox浏览器和Firefox OS,和许多其他产品。
官方网站:https://skia.org/
编译及配置方法可以参考Skia简介以及在Windows下编译操作步骤。注意Windows下还需要添加链接库:windowscodecs.lib usp10.lib以及需要添加一些预定义。
简单说一下我在用的时候遇到的几个坑。
1. 画任意曲线时,需要设置SkPaint的style,这个比较坑,找了好久,发现需要设置一下风格,否则使用SkPath类的moveTo()和lineTo()之后,画出的任意曲线是填充过的。这个跟Qt或者其他图形引擎不大相同。
SkPaint paint;
paint.setStyle(SkPaint::kStroke_Style);
2. 画一张带有透明背景的图片,alpha和rgb是4个字节,设置alpha值为0,填充后的图片即是透明的,之后再画一张bitmap即可。
SkCanvas canvas(new SkDevice(bitmap));
canvas.clear(0x00000000);
3. 注意2的例子是网上好多人写的,项目中用的时候发现内存泄漏的问题,new SkDevice改成栈上的就OK了。
简单例子:
#include "stdafx.h"
#include "SkBitmap.h"
#include "SkDevice.h"
#include "SkPaint.h"
#include "SkRect.h"
#include "SkImageEncoder.h"
#include "SkTypeface.h"
#include "SkCanvas.h" #pragma comment(lib,"core.lib")
#pragma comment(lib,"images.lib")
#pragma comment(lib,"ports.lib")
#pragma comment(lib,"opts.lib")
#pragma comment(lib,"utils.lib") const char *pText = "Hello world!"; int _tmain(int argc, _TCHAR* argv[])
{
const int width = ;
const int height = ; SkBitmap bitmap;
SkPath path; SkPaint paint;
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(0xff1f78b4);
paint.setStrokeWidth(); bitmap.setConfig(SkBitmap::kARGB_8888_Config,width,height);
bitmap.allocPixels(); SkCanvas canvas(new SkDevice(bitmap));
canvas.clear(0x00000000);// 背景为透明色 {
SkRect rc;
rc.fLeft = ;
rc.fTop = ;
rc.fRight = ;
rc.fBottom = ;
canvas.drawOval(rc, paint);
} {
paint.setARGB(, , , );
paint.setTextSize();
canvas.drawText(pText, strlen(pText), , , paint);
} {
paint.setColor(SK_ColorYELLOW);
canvas.drawCircle(, , , paint);
} {
SkPaint paint1, paint2, paint3; paint1.setTextSize(64.0f);
paint1.setAntiAlias(true);
paint1.setColor(0xff4281A4);
paint1.setStyle(SkPaint::kFill_Style); paint2.setTextSize(.f);
paint2.setAntiAlias(true);
paint2.setColor(0xff9CAFB7);
paint2.setStyle(SkPaint::kStroke_Style);
paint2.setStrokeWidth(SkIntToScalar()); paint3.setTextSize(64.0f);
paint3.setAntiAlias(true);
paint3.setColor(0xffE6B89C);
paint3.setTextScaleX(SkFloatToScalar(1.5f)); const char text[] = "jiayayao@126.com";
canvas.drawText(text, strlen(text), 200.0f, 64.0f, paint1);
canvas.drawText(text, strlen(text), 200.0f, 144.0f, paint2);
canvas.drawText(text, strlen(text), 200.0f, 224.0f, paint3);
} SkImageEncoder::EncodeFile("testSkia.png", bitmap,SkImageEncoder::kPNG_Type,); return ;
}

Skia一个大的优势是跨平台,比如在Windows平台可以用Direct3D图形API或者Gdiplus负责底层实现,用Skia在上层绘图,这样绘图逻辑基本可以不用修改,直接将bitmap的指针(char*)bitmap.getAddr32(0, 0)交给D3D绘制即可。
解决使用Skia图形库时遇到的几个问题的更多相关文章
- 解决CSharpGL使用CGCompiler时发现的几个问题
解决CSharpGL使用CGCompiler时发现的几个问题 为了获取CSharpShadingLanguage的token流,我设计了这样一个文法: <Expression> ::= & ...
- 解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题
解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 解决远程桌面链接时出现"The ...
- Android 如何解决dialog弹出时无法捕捉Activity的back事件
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到b ...
- 解决多人开发时使用window.onload的覆盖问题
通用型小函数:解决多人开发时,同时使用window.onload事件所出现的后面的window.onload函数覆盖前面一个window.onload函数的问题. function addLoadEv ...
- php函数:解决数组转对象时数组内中文乱码问题
function to_urlencode(&$arr){//解决数组转对象时数组内中文乱码问题 foreach($arr as $key => $value){ if(is_array ...
- 解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题
解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题. 有时候是src/main/resources下面的,有时候是sr ...
- Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
解决Python安装包时提示Unable to find vcvarsall.bat的问题 by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...
- 解决HTML加载时,外部js文件引用较多,影响页面打开速度问题
解决HTML加载时,外部js文件引用较多,影响页面打开速度问题 通常HTML文件在浏览器中加载时,浏览器都会按照<script>元素在页面中出现的先后顺序,对它们依次加载,一旦加载的j ...
- 解决silk-v3-decoder-master转换wav时,百度语音解析问题
$cur_dir/silk/decoder >& if [ ! -f "$1.pcm" ]; then /usr/local/ffmpeg/bin/ffmpeg -y ...
随机推荐
- DevExpress GridControl使用方法
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...
- MySQL MVCC(多版本并发控制)
概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...
- Windows+GCC下内存对齐的常见问题
结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attrib ...
- .NET组件程序设计之线程、并发管理(二)
.Net组件程序设计之线程.并发管理(二) 2.同步线程 手动同步 监视器 互斥 可等待事件 同步线程 所有的.NET组件都支持在多线程的环境中运行,可以被多个线程并发访问,如果没有线程同步,这样的后 ...
- ArcGIS之Cartogram地图变形记
一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ...
- 记一个简单的保护if 的sh脚本
真是坑爹,就下面的sh,竟然也写了很久! if [ `pwd` != '/usr/xx/bin/tomcat' ] then echo "rstall is not allowed in c ...
- Mysql5.7.13主从同步(复制)配置
主从同步是分布式mysql数据库相当重要的配置,现在我在虚拟机上完成主从配置,系统是CenterOS6.5,mysql版本是5.7.13 主服务器的ip是192.168.19.139 副服务器的ip是 ...
- VMware Tools安装小结
背景介绍:在VMware上装完ArchLinux后,窗口太小,操作不方便.查询后得知VMware Tools没有自动安装,需要手动安装. 官方安装说明:在 Linux 虚拟机中手动安装或升级 VMwa ...
- Android入门(二十一)解析XML
原文链接:http://www.orlion.ga/685/ 解析XML常用的方式有两种,一种是PULL解析一种是SAX解析. 假设解析数据为: <apps> <app> ...
- 远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)
上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机.其实 virt-manager 也可以管理其他宿主机上的虚机.只需要简单的将宿主机添加进来 填入宿主机的相关信息,确定即 ...