下面是两张巴布亚新几内亚的图片:
在视觉上它们是完全相同的-唯一的区别是在一些像素中有半透明的背景(你可以下载图像来检查它)。
但是当我在 JavaFX 节点上使用这些图像作为图像光标时,我得到以下结果:
第一个光标(没有部分透明像素)仍然清晰,但第二个会变形。
在与这个问题斗争了一段时间之后,我发现了解释这种差异混合模式的算法:
“期望”的方法(例如,您可以在这个浏览器中看到)是取每个通道的值之和,以 alpha 值加权: (1 - alpha) * background_color + alpha * foreground_color
。
“ JavaFXCursor”给出了不同的公式: (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();
}
}
如何实现这种半透明光标的正确呈现?