Skia绘图概述

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1Skia绘图概述Skia是Google一个底层的图形、文本、图像、动画等多方面的图形库,是Android中图形系统的引擎。Skia作为第三方软件放在external目录下:external/skia/。skia的源文件及部分头文件都在src目录下,导出的头文件在include目录下。使用Skia的API进行图形绘制时主要会用到一下几个类:SkBitmap、SkCanvas、SkPaint和SkRect,其中SkBitmap用来设置像素,SkCanvas写入位图,SkPaint设置颜色和样式,SkRect用来绘制矩形。其实现代码主要在src/core目录下。2使用Skia绘图的步骤a)定义一个位图32位像素并初始化SkBitmapbitmap;bitmap.setConfig(SkBitmap::kARGB_8888_Config,200,200);其中setConfig为设置位图的格式,原型为voidsetConfig(Config,intwidth,intheight,introwBytes=0)Config为一个数据结构enumConfig{kNo_Config,//不确定的位图格式kA1_Config,//1位(黑,白)位图kA8_Config,//8位(黑,白)位图kIndex8_Config,//类似windows下的颜色索引表,具体请查看SkColorTable类结构kRGB_565_Config,//16位象素565格式位图,详情请查看SkColorPriv.h文件kARGB_4444_Config,//16位象素4444格式位图,详情请查看SkColorPriv.h文件kARGB_8888_Config,//32位象素8888格式位图,详情请查看SkColorPriv.h文件kRLE_Index8_Config,kConfigCount};b)分配位图所占的空间bitmap.allocPixels()其实allocPixels为重载函数,原型为boolallocPixels(SkColorTable*ctable=NULL)参数ctable为颜色索引表,一般情况下为NULL。c)指定输出设备SkCanvascanvas(newSkDevice(bitmap));其中canvas为一个多构造函数,原型为explicitSkCanvas(constSkBitmap&bitmap),explicitSkCanvas(SkDevice*device=NULL)explicit关健字的意思为:不允许类型转换输出设备可以为一个上下文Device,也可以指定为一张位图。d)设备绘制的风格Paintpaint;SkRectr;paint.setARGB(255,255,0,0);r.set(25,25,145,145);canvas.drawRect(r,paint);paint可以指定绘图的颜色,文本的大小及对齐方式,编码格式等等,因为以前位图的格式设置为kARGB_8888_Config,所以这里要设置绘制的颜色setARGB(255,255,0,0),第一位参数为透明颜色通道,其它三位分别为R、G、B。r设置要绘制的范围,最后通过drawRect绘制出指定区域的一个方形。这样,一个红色的矩形就绘制成功了。SkCanvas主要完成三种绘制功能:a基本图形绘制(如drawARGB,drawLine函数)b图像文件绘制(drawBitmap函数)c文本绘制(drawText函数)相关API有:canvas.drawRect(rect,paint);canvas.drawOval(oval,paint);canvas.drawCircle(x,y,radius,paint);canvas.drawRoundRect(rect,rx,ry,paint);canvas.drawPath(path,paint);canvas.drawBitmap(bitmap,x,y,&paint);canvas.drawBitmapRect(bitmap,&srcRect,dstRect,&paint);canvas.drawBitmapMatrix(bitmap,matrix,&paint);canvas.drawText(text,length,x,y,paint);canvas.drawPosText(text,length,pos[],paint);canvas.drawTextOnPath(text,length,path,paint);e)例程i)画点、线、圆、文字#includeSkBitmap.h#includeSkDevice.h#includeSkPaint.h#includeSkRect.h#includeSkImageEncoder.h#includeSkTypeface.husingnamespacestd;intmain(){SkBitmapbitmap;bitmap.setConfig(SkBitmap::kARGB_8888_Config,320,240);bitmap.allocPixels();SkCanvascanvas(newSkDevice(bitmap));SkPaintpaint;//drawpointswithred.paint.setARGB(255,255,0,0);paint.setStrokeWidth(4);canvas.drawPoint(40,30,paint);canvas.drawPoint(80,60,paint);canvas.drawPoint(120,90,paint);//drawalinewithgreen.paint.setARGB(255,0,255,0);paint.setStrokeWidth(4);canvas.drawLine(160,10,320,110,paint);//drawacirclewithbule.paint.setARGB(255,0,0,255);canvas.drawCircle(80,180,50,paint);//drawtextwithredSkTypeface*font=SkTypeface::CreateFromFile(simkai.ttf);if(font){paint.setARGB(255,255,0,0);paint.setTypeface(font);paint.setTextSize(24);canvas.drawText(HELLO!:),8,200,180,paint);}SkImageEncoder::EncodeFile(snapshot.png,bitmap,SkImageEncoder::kPNG_Type,100);return0;}程序执行后,得到如下输出结果:ii)图像的编解码该例程目前测试只支持.png格式的图片,.jpg还不支持,还未找到原因。#includeSkBitmap.h#includeSkDevice.h#includeSkPaint.h#includeSkRect.h#includeSkImageEncoder.h#includeSkImageDecoder.h#includeiostreamusingnamespacestd;intmain(){intret=-1;SkBitmapbitmap;//SkImageDecoderret=SkImageDecoder::DecodeFile(./old.png,&bitmap);coutgetthedecodetype=bitmap.config()endl;//SkImageEncoderret=SkImageEncoder::EncodeFile(new1.png,bitmap,SkImageEncoder::kPNG_Type,100);coutencodedatatopngresult=retendl;return0;}SkImageDecoder::DecodeFile(./old.png,&bitmap);将png转换成位图格式,并将数据放到bitmap变量中SkImageEncoder::EncodeFile(snapshot.png,bitmap,SkImageEncoder::kPNG_Type,/*Qualityrangesfrom0..100*/100);将bitmap中的数据编码输出为.png格式,第一位参数为png文件路径,第二位为指定的输出位图,第三位为文件的类型,第四位参数指定了输出位图的质量,范围为0..100,默认为80。3图形图像特效src/effects目录的文件主要实现一些图形图像的特效,包括遮罩、浮雕、模糊、滤镜、渐变色、离散、透明以及PATH的各种特效等。4动画src/animator目录的文件主要实现了Skia的动画效果,Android不支持。5界面UI库src/view目录构建了一套界面UI库。组件包括Window,Menu,TextBox,ListView,ProgressBar,Widget,ScrollBar,TagList,Image等。6其它a)src/gl目录:这部分是skia调用OpenGL或OpenGLES来实现3D效果。如果定义了MAC,则使用OpenGL,如果定义了Android,则使用嵌入式系统上的esgl三维图形库。b)src/images目录:主要是SkImageDecoder和SkImageEncoder以及SkMovie。主要是用来处理images的,能处理的图像类型包括:BMP、JPEG/PVJPEG、PNG、ICO,而SkMovie是用来处理gif动画的。c)src/opts目录:性能优化的代码。d)src/pdf目录:处理PDF文档,用了一个fpdfemb库。e)src/ports目录:这部分是skia的一些接口在不同系统上的实现,平台相关的代码,比如字体、线程、时间等,主要包括几个部分:Font,Event,File,Thread,Time,XMLParser这些与Skia的接口,需要针对不同的操作系统实现。f)src/svg目录:矢量图像,Android不支持。SkSVGPath,SkSVGPolyline,SkSVGRect,SkSVGText,SkSVGLine,SkSVGImage,SkSVGEllipse等等。g)src/text目录:???h)src/utils目录:是一些辅助工具类。SkCamera,SkColorMatrix,SkOSFile,SkProxyCanvas,SkInterpolator等文件。i)src/xml:这是处理xml数据的部分,skia在这里只是对xml解析器做了一层包装,具体的xml解析器的实现需要根据不同的操作系统及宿主程序来实现。j)Third-partylibrary除了自身的所有文件外,skia还使用了一些third-partylibrary以及包含了不少linux上的头文件。通过分析skia源程序,发现skia主要使用以下几个第三方库:Zlib,处理数据的压缩和解压缩Jpeglib,处理jpeg图像的编码解码Pnglib,处理png图像的编码解码giflib,处理gif图像fpdfemb,处理pdf文档skia还需要一些linux/unix下的头文件(可能还需要更多):stdint.hunistd.hfeatures.hcdefs.hstubs.hposix_opt.htypes.hwordsize.htypesizes.hconfname.hgetopt.hmman.h

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功