当前位置: 首页 > 知识库问答 >
问题:

如何将Skija用于JavaFX?

微生高谊
2023-03-14

如何使用Skija for JavaFX?

这是存储库中的代码示例

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

Paint paint = new Paint();
paint.setColor(0xFFFF0000);
canvas.drawCircle(50, 50, 30, paint);

但是如何将这个skija画布对象转换为JavaFX节点呢?

共有2个答案

陶宜民
2023-03-14

这个答案基于James_D注释使用byte[]作为输入流。这是示例代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.jetbrains.skija.*;

import java.io.ByteArrayInputStream;

public class SkijaFX extends Application{
    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        Surface surface = Surface.makeRasterN32Premul(100, 100);
        Canvas canvas = surface.getCanvas();
        Paint paint = new Paint();
        canvas.drawCircle(50, 50, 30, paint);
        Image image = surface.makeImageSnapshot();
        Data data = image.encodeToData(EncodedImageFormat.PNG);
        byte[] pngBytes = data.getBytes();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(pngBytes);

        javafx.scene.image.Image imageFx = new javafx.scene.image.Image(inputStream);
        ImageView imageView = new ImageView(imageFx);

        StackPane root = new StackPane(imageView);
        Scene scene = new Scene(root, 300, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

更新:

正如mipa所建议的,如果我们使用JavaFX 13及以上版本,而不是使用ByteArrayInputStream,我们可以使用WritableImagePixelBuffer来创建ImageView

李凯定
2023-03-14

上述代码的这种变体应该可以更快地进行转换,因为它完全避免了将原始图像数据编码和解码为PNG,然后再编码和解码。注意:这只适用于最新的JavaFX版本,因为它使用了一些较新的功能。

import org.jetbrains.skija.Canvas;
import org.jetbrains.skija.Image;
import org.jetbrains.skija.Paint;
import org.jetbrains.skija.Surface;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelBuffer;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SkijaFX extends Application{
    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        Surface surface = Surface.makeRasterN32Premul(100, 100);
        Canvas canvas = surface.getCanvas();
        Paint paint = new Paint();
        canvas.drawCircle(50, 50, 30, paint);
        Image image = surface.makeImageSnapshot();
        
        ImageView imageView = new ImageView(new WritableImage(new PixelBuffer<>(image.getWidth(), image.getHeight(), image.peekPixels().asIntBuffer(), PixelFormat.getIntArgbPreInstance())));

        StackPane root = new StackPane(imageView);
        Scene scene = new Scene(root, 300, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

更新:在这个变体中,颜色是错误的。斯基亚的原生形象表现似乎并不完整。(需要进一步调查。)原始版本通过PNG转换避免了这个问题。

 类似资料:
  • 如何将Skija转换为? Skija可以给我一个以某种格式编码的字节列表,但这不是我需要的。

  • 问题内容: 我的数据库中有一列,该列具有各种字符数组,例如。 我有一个查询,我试图获得这些数组的聚合而没有成功: 623和625具有相同的值,因此结果应该是seids和的分组,但我一直不断遇到此错误: 如果删除部分代码,则确实会获得带有和返回的表。 问题答案: 标准聚合函数仅适用于基本类型,不适用于输入的数组类型。(但是 Postgres 9.5+ 具有该功能的新变体!) 您可以使用 此相关答案中

  • 我想在C#上创建检查消息签名的方法。我得到公钥数据,消息,签名,我有一个C示例。 C代码: 在C#中,我尝试: 但是我不知道我应该如何使用<code>和<code>的pubkey。如何将openkey添加到ECDsa。 我使用ECDsa.Create是因为我想有跨平台代码。 我尝试了但这用于ECDsaCng,它只使用Windows。 我可以使用< code>ECDsa。Create(ECParam

  • 问题内容: 我有一个简单的页面,其中包含一些iframe部分(以显示RSS链接)。如何将相同的CSS格式从首页应用到iframe中显示的页面? 问题答案: 编辑:除非设置了适当的CORS标头,否则这不能跨域工作。 这里有两件事:iframe块的样式和嵌入在iframe中的页面的样式。您可以按通常方式设置iframe块的样式: 必须通过将iframe中嵌入的页面样式包含在子页面中来进行设置: 或者可

  • 问题内容: 我似乎看到了一些例子,人们回答了如何通过添加CSS代码从组件中获得某些特定行为的问题,但是似乎没人解释如何使用该CSS代码将其连接到Java组件… 例如,如何在我创建的表上使用此代码? 问题答案: 您可以创建自己的自定义主题。请参阅https://vaadin.com/book/-/page/themes.creating.html如何做到这一点。 在此主题中,您具有一个CSS样式表,

  • 问题内容: 我正在对项目上的纯Java文件运行纯JUnit4 Java测试,但是如果不手动将其公开,我将找不到一种清晰使用@VisibleForTesting的方法。 例如: 方法必须是使其对测试“公开”,但是在那种情况下,注释没有意义吗?如果批注什么也不做,为什么不只使用注释呢? 问题答案: 标签本身可以帮助短绒棉子识别不需要的访问。 为了降低使用风险直接,添加此方法是在 科特林 或在 Java