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图形库时遇到的几个问题的更多相关文章

  1. 解决CSharpGL使用CGCompiler时发现的几个问题

    解决CSharpGL使用CGCompiler时发现的几个问题 为了获取CSharpShadingLanguage的token流,我设计了这样一个文法: <Expression> ::= & ...

  2. 解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题

    解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 解决远程桌面链接时出现"The ...

  3. Android 如何解决dialog弹出时无法捕捉Activity的back事件

    Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到b ...

  4. 解决多人开发时使用window.onload的覆盖问题

    通用型小函数:解决多人开发时,同时使用window.onload事件所出现的后面的window.onload函数覆盖前面一个window.onload函数的问题. function addLoadEv ...

  5. php函数:解决数组转对象时数组内中文乱码问题

    function to_urlencode(&$arr){//解决数组转对象时数组内中文乱码问题 foreach($arr as $key => $value){ if(is_array ...

  6. 解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题

    解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题. 有时候是src/main/resources下面的,有时候是sr ...

  7. Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题

    解决Python安装包时提示Unable to find vcvarsall.bat的问题   by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...

  8. 解决HTML加载时,外部js文件引用较多,影响页面打开速度问题

    解决HTML加载时,外部js文件引用较多,影响页面打开速度问题   通常HTML文件在浏览器中加载时,浏览器都会按照<script>元素在页面中出现的先后顺序,对它们依次加载,一旦加载的j ...

  9. 解决silk-v3-decoder-master转换wav时,百度语音解析问题

    $cur_dir/silk/decoder >& if [ ! -f "$1.pcm" ]; then /usr/local/ffmpeg/bin/ffmpeg -y ...

随机推荐

  1. 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

    前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...

  2. Web Modify The Html Elements According Url Parameters With Jquery

    需求说明 根据URL的参数, 来批量的对某些HTML元素做统一的修改. 解决思路 首先, 想办法获得这个URL的参数, 然后遍历对应的HTML元素, 做出对应的修改. 即可. 代码实现 <!DO ...

  3. Android 透明度百分比对应的 十六进制

    Android 透明度百分比对应的 十六进制 先把结果放在这里,方便大家查询,也方便自己,UI太喜欢用百分比表示了=.=! 透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍 ...

  4. HTML5_02之视频、音频、Canvas

    1.HTML5新特性之视频播放--video: ①例:<video src=""></video> ②video标签默认为300*150的inline-bl ...

  5. Windows中搭建Redis集群

    从 http://rubyinstaller.org/downloads/ 下载Ruby2.2.5(x64)并安装,安装时勾选添加至路径变量中 命令行中执行gem source -a http://g ...

  6. 读书笔记-you-don't-konw-js

    第一部分:作用域和闭包 不要满足于只是让代码正常工作,而是弄清楚为什么是这样 作用域是什么 定义的变量存储在哪里?程序是如何找到变量的?实现的 规则就是作用域 传统编译语言执行前的编译三步骤(p5) ...

  7. C#设计模式系列:备忘录模式(Memento)

    1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...

  8. 【WP开发】加密篇:双向加密

    说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES.AES等.在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不 ...

  9. iTween 动画类型

    iTween 动画类型 http://robertpenner.com/easing/easing_demo.html 使用范例 http://www.xuanyusong.com/archives/ ...

  10. Javascript中关键参数this浅析

    自从接触javascript以来,对this参数的理解一直是模棱两可.虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪. 但对于this参数,确实会让人产生很多误解.那么this参数到底 ...