Java Skija 绘图库绘制图形

参考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的能力。

技术分析

  1. 跨平台兼容性:Skija支持Windows、macOS、Linux和Android等操作系统,这意味着你的图形密集型应用可以在多种环境下流畅运行。

  2. 高性能渲染:基于Skia,Skija提供了硬件加速的功能,确保了图像和图形处理的高效性能,无论是绘制复杂的2D图形还是处理大量的图像数据,都能保持流畅。

  3. 丰富的API:Skija提供了丰富的绘图函数,涵盖颜色管理、路径、文本布局、图片操作等各种2D图形操作,使得开发者能够创建出高度定制化的视觉效果。

  4. 与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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值