Изменить оттенок цвета каждой формы

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

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

Изменить оттенок цвета каждой формы

Мне не понятно слово "другая форма зеленого". И у меня тоже немного неясный вопрос. Не могли бы вы четко объяснить, что вы на самом деле хотите сделать? пишет образ? Если возможно, опубликуйте код того, что вы пробовали до сих пор... чтобы мы могли быстро понять, что вы пытаетесь сделать.

Sai Dandem 11.03.2019 22:41

Я предполагаю, что OP хочет сделать каждую коробку разным оттенок (тип, вариант и т. д.) зеленого цвета. Он/она знает, как перекрасить все изображение, но не знает, как ограничить раскрашивание определенной областью (а-ля алгоритм заливки заливкой)

Matt 11.03.2019 23:04

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

zZurf 11.03.2019 23:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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"));

Большое спасибо за это, но есть ли способ сделать это вместо image.png? или это все усложнит?

zZurf 11.03.2019 23:36

Экспортировать корневой узел как изображение легко. Я добавил эту часть в свой ответ. Если вы хотите использовать изображение в качестве входных данных, все будет намного сложнее. В этом случае вы должны использовать методы обработки изображений.

Samuel Philipp 11.03.2019 23:52

Я вижу, большое спасибо за вашу помощь, очень ценю это.

zZurf 12.03.2019 00:01

Другие вопросы по теме