参考github:https://github.com/HumbleUI/Skija
Skija
Skija:强大的跨平台Java图形渲染库
项目地址:https://gitcode.com/JetBrains/skija
Skija是一个由JetBrains开发的开源项目,其目标是为Java和Kotlin开发者提供一个高性能、易用的2D图形API,直接与Google的Skia图形库对接。通过Skija,你可以轻松地在多个平台上构建富视觉应用,包括桌面、移动设备甚至是Web。
Skija是Skia的Java接口,它将Skia的强大功能暴露给Java和Kotlin开发者。Skia是Google广泛使用的2D图形处理引擎,被Android、Chrome、Flutter等多个知名项目采用。借助Skija,开发者无需学习C++或绑定原生代码,就能充分利用Skia的能力。
技术分析
-
跨平台兼容性:Skija支持Windows、macOS、Linux和Android等操作系统,这意味着你的图形密集型应用可以在多种环境下流畅运行。
-
高性能渲染:基于Skia,Skija提供了硬件加速的功能,确保了图像和图形处理的高效性能,无论是绘制复杂的2D图形还是处理大量的图像数据,都能保持流畅。
-
丰富的API:Skija提供了丰富的绘图函数,涵盖颜色管理、路径、文本布局、图片操作等各种2D图形操作,使得开发者能够创建出高度定制化的视觉效果。
-
与Java和Kotlin的紧密集成:由于Skija是用Java编写的,并且完全兼容Kotlin,所以对于熟悉这两种语言的开发者来说,上手非常快,无需额外学习新语法。
安装jar
<dependency>
<groupId>io.github.humbleui</groupId>
<artifactId>skija-windows-x64</artifactId>
<version>0.116.2</version>
</dependency>
Demo
package org.demo.apptest1.draw;
import io.github.humbleui.skija.ColorAlphaType;
import io.github.humbleui.skija.ColorType;
import io.github.humbleui.skija.ImageInfo;
import io.github.humbleui.skija.PaintStrokeCap;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
/**
* @author zhe.xiao
* @version 1.0
* @since 2024/6/14 上午10:39
*/
class LinePos {
int x0 = 0;
int y0 = 0;
int x1 = 0;
int y1 = 0;
}
@Data
@Slf4j
public class DrawImageExample {
private int imageWidth;
private int imageHeight;
private int lineXGap = 10;
private int lineYGap = 20;
private int rowGap = 30;
public DrawImageExample(int imageWidth, int imageHeight) {
this.imageWidth = imageWidth;
this.imageHeight = imageHeight;
}
public void drawLine(io.github.humbleui.skija.Canvas canvas) {
io.github.humbleui.skija.Paint paint = new io.github.humbleui.skija.Paint();
paint.setColor(0xFF000000).setMode(io.github.humbleui.skija.PaintMode.STROKE_AND_FILL).setStrokeWidth(1.5f).setStrokeCap(PaintStrokeCap.SQUARE);
canvas.clear(0xFFFFFFFF);
LinePos linePos = new LinePos();
int i = 0;
int row = 1;
while (row * rowGap < imageHeight) {
while (linePos.x1 < imageWidth) {
if (i % 4 == 0) {
linePos.y0 = row * rowGap;
linePos.x1 += lineXGap;
linePos.y1 = row * rowGap;
} else if (i % 4 == 1) {
linePos.x0 = linePos.x1;
linePos.y0 = linePos.y1;
linePos.y1 = lineYGap + row * rowGap;
} else if (i % 4 == 2) {
linePos.x0 = linePos.x1;
linePos.y0 = linePos.y1;
linePos.x1 += lineXGap;
} else {
linePos.x0 = linePos.x1;
linePos.y0 = linePos.y1;
linePos.y1 = 0 + row * rowGap;
}
canvas.drawLine(linePos.x0, linePos.y0, linePos.x1, linePos.y1, paint);
i++;
}
row++;
i = 0;
linePos.x0 = 0;
linePos.y0 = 0;
linePos.x1 = 0;
linePos.y1 = 0;
}
}
public void drawText(io.github.humbleui.skija.Canvas canvas) {
io.github.humbleui.skija.Typeface face = io.github.humbleui.skija.Typeface.makeFromFile("E:\\msyh.ttc");
io.github.humbleui.skija.Font font = new io.github.humbleui.skija.Font(face);
font.setSize(15);
io.github.humbleui.skija.Paint paint = new io.github.humbleui.skija.Paint();
paint.setColor(0xFF000000).setStrokeWidth(1f);
canvas.drawString("大家好,这个测试", 10, 20, font, paint);
}
public void outputImg() {
long s = System.currentTimeMillis();
ImageInfo imageInfo = new ImageInfo(imageWidth, imageHeight, ColorType.RGBA_F32, ColorAlphaType.PREMUL);
var surface = io.github.humbleui.skija.Surface.makeRaster(imageInfo);
var canvas = surface.getCanvas();
drawLine(canvas);
drawText(canvas);
io.github.humbleui.skija.Image image = surface.makeImageSnapshot();
io.github.humbleui.skija.Data pngData = image.encodeToData(io.github.humbleui.skija.EncodedImageFormat.PNG);
ByteBuffer pngBytes = pngData.toByteBuffer();
try {
java.nio.file.Path path = java.nio.file.Path.of("output.png");
ByteChannel channel = Files.newByteChannel(path, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
channel.write(pngBytes);
channel.close();
} catch (IOException e) {
log.error("err", e);
}
long e = System.currentTimeMillis();
log.info("output img cost {} ms", e - s);
}
public static void main(String[] args) {
new DrawImageExample(960, 600).outputImg();
}
}
3321

被折叠的 条评论
为什么被折叠?



