为什么javafx要修改我的半透明光标?
以下是两张 PNG 图像:
在视觉上,它们完全相同 - 唯一的区别是在某些像素中具有半透明背景(您可以下载图像进行检查)。
但是,当我在JavaFX节点上使用这些图像作为图像光标时,我得到以下结果:
第一个光标(没有部分透明的像素)仍然清晰,但第二个光标失真。
在与问题斗争了一段时间后,我发现了解释这种差异的算法 - 混合模式:
“预期”方式(例如,您可以在此浏览器中看到)是采用每个通道的值的总和,按 Alpha 值加权:。
(1 - alpha) * background_color + alpha * foreground_color
“JavaFX Cursor”给出了不同的公式:(注意正方形)。
(1 - alpha) * background_color + alpha^2 * foreground_color
我发现了失真,但我无法弄清楚我做错了什么,以及如何纠正这个问题。
以下是我的测试程序的完整可运行源代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.ImageCursor;
import javafx.scene.image.Image;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
System.out.println(ImageCursor.getBestSize(32, 32));
primaryStage.setTitle("Hello World!");
StackPane root = new StackPane();
root.setCursor(new ImageCursor(new Image("/test-cursor.png"), 0, 0));
primaryStage.setScene(new Scene(root, 100, 100));
primaryStage.show();
}
}
如何正确呈现此类半透明光标?