以下是两个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();
}
}
如何实现这种半透明游标的正确渲染?