android skia 使用实例

#include "SkBitmap.h"

#include "SkDevice.h"

#include "SkPaint.h"

 

#include "SkRect.h"

#include "SkImageEncoder.h"

 

int main()

{

        // Declare a raster bitmap, which has an integer width and height,

        // and a format (config), and a pointer to the actual pixels.

        // Bitmaps can be drawn into a SkCanvas, but they are also used to

 

        // specify the target of a SkCanvas' drawing operations.

        SkBitmap bitmap;

        bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);

        bitmap.allocPixels();

 

        // A Canvas encapsulates all of the state about drawing into a

        // device (bitmap).  This includes a reference to the device itself,

        // and a stack of matrix/clip values. For any given draw call (e.g.

        // drawRect), the geometry of the object being drawn is transformed

        // by the concatenation of all the matrices in the stack. The

        // transformed geometry is clipped by the intersection of all of the

 

        // clips in the stack.

        SkCanvas canvas(new SkDevice(bitmap));

 

        // SkPaint class holds the style and color information about how to

        // draw geometries, text and bitmaps.

        SkPaint paint;

 

        // SkIRect holds four 32 bit integer coordinates for a rectangle.

 

        SkRect r;

 

        paint.setARGB(255, 255, 0, 0);

        r.set(25, 25, 145, 145);

        canvas.drawRect(r, paint);

 

        paint.setARGB(255, 0, 255, 0);

        r.offset(20, 20);

        canvas.drawRect(r, paint);

 

        paint.setARGB(255, 0, 0, 255);

        r.offset(20, 20);

        canvas.drawRect(r, paint);

 

        // SkImageEncoder is the base class for encoding compressed images

        // from a specific SkBitmap.

        SkImageEncoder::EncodeFile("snapshot.png", bitmap,

               SkImageEncoder::kPNG_Type,

               100);

        return 0;

}

编译方式:

g++ \

        -I./include \

        -I./include/core \

        -I./include/images \                                                              

        -Wall -o test-skia test-skia.c \

        out/src/images/SkImageDecoder_libpng.o out/libskia.a \

        -lpng -lpthread -g

笔者做了简要的批注,大概可知晓 Sk 开头的这些 API 的功用,而上述的范例程序一开始就要求 Skia 配置画布 (SkCanvas),接着透过一份 SkRect 对象 r,给定 ARGB 的描述,使其有着不同的颜色,再来就是调整向量对象的位移并绘制。正如前文提及,Skia 仅是绘图引擎,并未如 Cairo 一般广泛对应到 PDF, X11, GDI 等等底层绘图装置,所以为了方便观察绘图结果,我们透过 Skia 内建的 image codec 来输出 PNG 图档,所以执行前述编译后的执行档 "test-skia",应该会得到以下图档:(本无外框与底色,但为了清楚于文章呈现,额外用绘图软件追加)

 


迭合的三个不同色的矩形对象,就是透过以下 API 呼叫达成:

        paint.setARGB(255, 0, 255, 0);

        r.offset(20, 20);

        canvas.drawRect(r, paint);

由于 Skia 与 Cairo 的同构型相当高,也可参照 [Cairo :: documentation] 建立所需的背景知识。

转载,

原地址:http://blog.sina.com.cn/s/blog_4a0a39c30100cog4.html

另外一个例子:

#include "SkBitmap.h"
#include "SkDevice.h"
#include "SkPaint.h"
#include "SkRect.h"
#include 

int main()
{
  SkBitmap bitmap;
  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
  bitmap.allocPixels();
  SkDevice device(bitmap);
  SkCanvas canvas(&device);
  SkPaint paint;
  SkRect r;

  paint.setARGB(255, 255, 255, 255);
  r.set(10, 10, 20, 20);
  canvas.drawRect(r, paint);

  paint.setARGB(255, 255, 0, 0);
  r.offset(5, 5);
  canvas.drawRect(r, paint);

  paint.setARGB(255, 0, 0, 255);
  r.offset(5, 5);
  canvas.drawRect(r, paint);

  {
    SkAutoLockPixels image_lock(bitmap);
    cairo_surface_t* surface = cairo_image_surface_create_for_data(
        (unsigned char*)bitmap.getPixels(), CAIRO_FORMAT_ARGB32,
        bitmap.width(), bitmap.height(), bitmap.rowBytes());
    cairo_surface_write_to_png(surface, "snapshot.png");
    cairo_surface_destroy(surface);
  }

  return 0;
}

原地址:http://www.linuxgraphics.cn/android/skia.html



你可能感兴趣的:(Android)