Изменить оттенок цвета каждой фигуры - PullRequest
2 голосов
/ 11 марта 2019

У меня есть следующее изображение, и мне нужно изменить цвет каждой фигуры на зеленый, но у каждого может быть свой оттенок зеленого. Я не уверен, как это сделать. У меня есть идея, как сделать это со всем изображением, изменив цвет пикселя, но не часть изображения.

Я очень новичок в javafx, так что имейте это в виду.

image

1 Ответ

0 голосов
/ 12 марта 2019

Самый простой способ добиться этого - создать изображение самостоятельно и добавить каждый прямоугольник отдельно.В этом случае вы можете установить цвет для каждого прямоугольника независимо:

public class MyApp extends Application {
    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 430, 230, Color.WHITE);

        List<Rectangle> rectangles = new ArrayList<>();

        int width = 100;
        int height = 50;
        int pad = 6;

        // first row
        rectangles.add(createRect(pad, pad, width, height, Color.GREEN));
        rectangles.add(createRect(pad + (width + pad), pad, width, height, Color.GREEN.brighter()));
        rectangles.add(createRect(pad + (width + pad) * 2, pad, width, height, Color.GREEN.darker()));
        rectangles.add(createRect(pad + (width + pad) * 3, pad, width, height, Color.GREEN));

        // second row
        rectangles.add(createRect(pad + (width + pad) * 0.5, pad + (height + pad), width, height, Color.GREEN.brighter()));
        rectangles.add(createRect(pad + (width + pad) * 1.5, pad + (height + pad), width, height, Color.GREEN));
        rectangles.add(createRect(pad + (width + pad) * 2.5, pad + (height + pad), width, height, Color.GREEN.darker()));

        // third row
        rectangles.add(createRect(pad + (width + pad), pad + (height + pad) * 2, width, height, Color.GREEN.darker()));
        rectangles.add(createRect(pad + (width + pad) * 2, pad + (height + pad) * 2, width, height, Color.GREEN));

        // last row
        rectangles.add(createRect(pad + (width + pad) * 1.5, pad + (height + pad) * 3, width, height, Color.GREEN.brighter()));

        root.getChildren().addAll(rectangles);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Rectangle createRect(double x, double y, double width, double height, Color color) {
        Rectangle rectangle = new Rectangle(x, y, width, height);
        rectangle.setStroke(Color.BLACK);
        rectangle.setFill(color);
        return rectangle;
    }
}

Результат будет следующим:

image result

В моем примере я использовал только три разных зеленых оттенка, но вы можете установить цвет для каждого прямоугольника самостоятельно и создавать градиенты или что угодно.Просто замените Color.GREEN на new Color(0.0f, 0.7f, 0.0f, 1f) и настройте параметры в соответствии с вашими потребностями.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Если вы хотитечтобы использовать сгенерированный узел в качестве изображения, вы можете использовать метод Node.snapshot для создания изображения:

WritableImage snapshot = root.snapshot(new SnapshotParameters(), null);

Если вы хотите заменить исходные прямоугольники изображением, вы можете использовать следующее:

root.getChildren().clear();
ImageView imageView = new ImageView(snapshot);
imageView.setX(pad);
imageView.setY(pad);
root.getChildren().add(imageView);

Чтобы сохранить изображение в виде файла, вы можете использовать:

ImageIO.write(SwingFXUtils.fromFXImage(snapshot, null), "PNG", new File("/path/to/image.png"));
...