当前位置: 首页 > 面试题库 >

JavaFX 8带Alpha的画布快照

诸龙野
2023-03-14
问题内容

我目前正在开发一个绘画程序(类似于Gimp和Photoshop),为了做到这一点,我将需要图层。我创建了一个名为JImage的类,其中包含ArrayList<Canvas> layers和一些方法。

public Image toImage(){ //Returns the final image which is all its layers combined into one canvas and snapshotted.
    Canvas c = new Canvas(width, height); //width and height are determined in the constructor
    for(int i=layers.size()-1;i>=0;i--){
        Canvas currLayer = layers.get(i);
        c.getGraphicsContext2D().drawImage(currLayer.snapshot(new SnapshotParameters(), new WritableImage(width,height)));
    }
    return c.snapshot(new SnapshotParameters(), new WritableImage(width,height));
}

我的问题是,当您这样做时canvas.snapshot(SnapshotParameters,WritableImage),不包括alpha层,并且背景始终为白色。这样可以防止我在没有丑陋的白色背景的情况下将其发送到文件中。有什么办法可以从具有alpha层的多个画布中获取图像?我希望将JavaFX用于此解决方案,因此请在JavaFX的范围内提供解决方案。


问题答案:

在拍摄快照之前,将SnapshotParameters
的填充设置为Color.TRANSPARENT。

SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
Image snapshot = currLayer.snapshot(params, null);

从javadoc:

将填充设置为指定值。这用于在渲染节点之前填充要渲染的整个图像。值为null表示应使用白色填充。默认值为空。



 类似资料:
  • 我目前正在开发一个绘画程序(类似于Gimp和Photoshop),为了做到这一点,我需要图层。我创建了一个名为JImage的类,它有一个

  • **编辑**我必须导出一个大画布(5Mo 当我导出我的画布(使用toDataUrl)时,它总是返回一个带有alpha通道的. png文件的bas64表示。阿尔法通道权重约为图像数据的25%,我不需要它。 建议的答复: PNG压缩是好的。如果alpha通道是平坦的(所有值都相同),则不会占用太多空间。即使使用完全不透明的alpha通道,也会显示(压缩)。png文件更大。(在一些测试中约为10%) 有

  • 下面可运行示例中的箭头应该用从箭头底部到箭头头部的红色alpha渐变填充。 我一定错过了什么明显的事情!? 谢谢你的调查! Stackoverflow希望我添加更多细节,因为“大部分是代码”,但我真的不知道要添加什么。:-)

  • 问题内容: 我正在宽度不相等的画布上绘制图形。每个画布是否都有自己的滚动条?我试图将所有画布放在一个div中,并指定最大宽度,但这没有用。是否可以将所有画布在页面上的可见宽度说成500像素,并且每个画布都有其滚动条以查看画布的整个宽度。 谢谢。 问题答案: 指定画布的总宽度,然后将其包裹在div中。将div设置为,并指定500px的宽度。然后,您应该具有滚动条,使您可以滚动并查看画布的隐藏部分。对

  • 本章将介绍如何使用Canvas和javax.swing包的JFrame类绘制JOGL基本框架。 在这里,我们将实例化一个JFrame,并使用add()方法将canvas对象添加到JFrame的实例中。 使用Canvas和AWT为您提供具有重量级功能的图形框架。 要拥有轻量级图形框架,您需要将GLCanvas与Swing一起使用。 将GLCanvas与Swing一起使用时,可以直接将GLCanvas

  • 我正在将以前在Swing中完成的一个类移植到JavaFX8。它显示一个UI元素,看起来像一个模拟电压表,有一个半圆,周围有一组固定间隔的“tic标记”。在Swing版本中,该类是JPanel的扩展,tic标记在paintComponent(图g)中绘制,如下所示: 这很有效。 现在使用JavaFX,我使用了一个扩展VBox的类。它包含2个堆叠的画布对象。其中一个将绘制静态元素,如半圆和tic标记,