Нижче розташовані два зображення PNG:
Візуально вони абсолютно ідентичні - єдина відмінність полягає в тому, що один має напівпрозорий фон у деяких пікселях (ви можете завантажити зображення, щоб перевірити це).
Але коли я використовую ці зображення як курсор зображень на вузлах JavaFX, я отримую такий результат:
Перший курсор (без частково прозорих пікселів) все ще чіткий, але другий спотворюється.
Деякий час боровшись із проблемою, я виявив алгоритм, який враховує цю різницю - режим змішування:
«Очікуваний» шлях (який ви можете бачити в цьому браузері, наприклад), щоб взяти суму значень для кожного каналу, зважений альфа значень:
(1 - alpha) * background_color + alpha * foreground_color
."Курсор JavaFX" дає іншу формулу:
(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();
}
}
Як я можу досягти належного відображення таких напівпрозорих курсорів?