如何使用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节点呢?
这个答案基于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
,我们可以使用WritableImage
和PixelBuffer
来创建ImageView
上述代码的这种变体应该可以更快地进行转换,因为它完全避免了将原始图像数据编码和解码为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