Why is javafx mangling my semi-transparent cursors?

Обновить

December 2018

Просмотры

655 раз

46

Ниже приведены два 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();
    }
}

Как можно достичь надлежащего предоставления этих полупрозрачных курсоров?

0 ответы