JetBrains Skija 图形库入门指南
【免费下载链接】skija Java bindings for Skia 项目地址: 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 类大多继承自 RefCnt 或 Managed,底层使用 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);
}
}
文本绘制
字体设置
绘制文本需要 Typeface 和 Font 两个关键类:
// 从系统字体创建
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);
}
在实际应用中,建议缓存 Typeface 和 Font 对象以提高性能。
高级功能
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- 渐变和纹理效果Typeface和Font- 文本渲染
结语
Skija 将强大的 Skia 图形库带到了 JVM 平台,为 Java 开发者提供了专业的 2D 图形绘制能力。无论是简单的图像生成还是复杂的交互式图形应用,Skija 都能胜任。希望本指南能帮助你快速上手 Skija,开启图形编程之旅。
【免费下载链接】skija Java bindings for Skia 项目地址: https://gitcode.com/gh_mirrors/sk/skija
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



