JetBrains Skija 图形库入门指南

JetBrains Skija 图形库入门指南

【免费下载链接】skija Java bindings for Skia 【免费下载链接】skija 项目地址: https://gitcode.com/gh_mirrors/sk/skija

前言

JetBrains Skija 是一个基于 Skia 图形库的 Java 绑定项目,为 JVM 平台提供了强大的 2D 图形绘制能力。Skia 是 Google 开发的开源 2D 图形库,被广泛应用于 Chrome 浏览器、Android 系统等知名项目中。通过 Skija,Java 开发者可以轻松使用这些专业的图形绘制功能。

环境准备

添加依赖

首先需要在项目中添加 Skija 的依赖。根据你的操作系统选择对应的 artifact:

  • Windows 平台:org.jetbrains.skija:skija-windows
  • Linux 平台:org.jetbrains.skija:skija-linux
  • macOS x64 平台:org.jetbrains.skija:skija-macos-x64
  • macOS ARM64 平台:org.jetbrains.skija:skija-macos-arm64

请将 ${version} 替换为最新版本号。建议使用构建工具(如 Maven、Gradle)来管理依赖。

基础导入

在 Java 代码中,需要导入以下核心类:

import org.jetbrains.skija.*;
import java.io.IOException;

绘制第一个图形

创建画布

Skija 的核心是 Canvas 类,它提供了各种绘图方法。最简单的创建画布的方式是创建一个基于位图的内存画布:

Surface surface = Surface.makeRasterN32Premul(100, 100);
Canvas canvas = surface.getCanvas();

这里创建了一个 100x100 像素的 RGBA 预乘格式的位图表面。

设置画笔

绘图通常需要 Paint 对象来定义绘制样式:

Paint paint = new Paint();
paint.setColor(0xFFFF0000);  // 设置红色

颜色使用 32 位 ARGB 格式表示:

  • 0xFFFF0000 表示不透明的红色
  • 0x80FF0000 表示半透明的红色
  • 0x00000000 表示完全透明

绘制图形

现在可以在画布上绘制一个圆形:

canvas.drawCircle(50, 50, 30, paint);

保存图像

绘制完成后,可以将图像保存为 PNG 文件:

Image image = surface.makeImageSnapshot();
Data pngData = image.encodeToData(EncodedImageFormat.PNG);
ByteBuffer pngBytes = pngData.toByteBuffer();

try {
    Path path = Path.of("output.png");
    ByteChannel channel = Files.newByteChannel(
        path,
        StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
    channel.write(pngBytes.toByteBuffer());
    channel.close();
} catch (IOException e) {
    System.out.println(e);
}

API 设计特点

方法链式调用

Skija 的 API 设计支持方法链式调用,使代码更加简洁:

var paint = new Paint()
    .setColor(0xFF1D7AA2)
    .setMode(PaintMode.STROKE)
    .setStrokeWidth(1f);

资源管理

Skija 类大多继承自 RefCntManaged,底层使用 C++ 实现。Java 的垃圾回收机制会自动管理这些资源,但也可以手动释放:

// 自动管理
void drawCircle(Canvas c) {
    Paint p = new Paint();
    c.drawCircle(0, 0, 10, p);
}

// 手动立即释放
void drawCircle(Canvas c) {
    try (Paint p = new Paint()) {
        c.drawCircle(0, 0, 10, p);
    }
}

文本绘制

字体设置

绘制文本需要 TypefaceFont 两个关键类:

// 从系统字体创建
Typeface face = FontMgr.getDefault().matchFamilyStyle("Menlo", FontStyle.NORMAL);

// 从文件创建
Typeface face = Typeface.makeFromFile("Inter.ttf");

// 创建字体
Font font = new Font(face, 13);

绘制文本

try (Typeface face = FontMgr.getDefault().matchFamilyStyle("Menlo", FontStyle.NORMAL);
     Font font = new Font(face, 13);
     Paint fill = new Paint().setColor(0xFF000000)) {
    canvas.drawString("Hello, world", 0, 0, font, fill);
}

在实际应用中,建议缓存 TypefaceFont 对象以提高性能。

高级功能

OpenGL 渲染

Skija 支持 OpenGL 渲染,适合交互式应用:

// 初始化 OpenGL 窗口
glfwInit();
long windowHandle = glfwCreateWindow(width, height, "Skija Demo", NULL, NULL);

// 创建 Skia OpenGL 上下文
DirectContext context = DirectContext.makeGL();

// 创建渲染目标和表面
BackendRenderTarget renderTarget = BackendRenderTarget.makeGL(
    width, height, 0, 8, fbId, FramebufferFormat.GR_GL_RGBA8);

Surface surface = Surface.makeFromBackendRenderTarget(
    context, renderTarget, SurfaceOrigin.BOTTOM_LEFT, 
    SurfaceColorFormat.RGBA_8888, ColorSpace.getSRGB());

// 渲染循环
while (!glfwWindowShouldClose(windowHandle)) {
    // 绘制代码...
    context.flush();
    glfwSwapBuffers(windowHandle);
    glfwPollEvents();
}

高级图形功能

Skija 还支持许多高级图形功能:

  • 路径绘制(Path 类)
  • 图像处理(Image 类)
  • 着色器效果(Shader 类)
  • 复杂文本布局(ParagraphBuilder 类)

学习资源

建议从以下核心类开始学习:

  • Canvas - 绘图操作的主要接口
  • Paint - 定义绘制样式
  • Path - 复杂形状绘制
  • Image - 图像处理
  • Shader - 渐变和纹理效果
  • TypefaceFont - 文本渲染

结语

Skija 将强大的 Skia 图形库带到了 JVM 平台,为 Java 开发者提供了专业的 2D 图形绘制能力。无论是简单的图像生成还是复杂的交互式图形应用,Skija 都能胜任。希望本指南能帮助你快速上手 Skija,开启图形编程之旅。

【免费下载链接】skija Java bindings for Skia 【免费下载链接】skija 项目地址: https://gitcode.com/gh_mirrors/sk/skija

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值