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




Самый простой способ добиться этого — создать изображение самостоятельно и добавить каждый прямоугольник по отдельности. В этом случае вы можете установить цвет для каждого прямоугольника независимо:
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;
}
}
Результат будет следующим:
В моем примере я использовал только три разных оттенка зеленого, но вы можете задать цвет для каждого прямоугольника по своему усмотрению и создать градиенты или что угодно. Просто замените 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? или это все усложнит?
Экспортировать корневой узел как изображение легко. Я добавил эту часть в свой ответ. Если вы хотите использовать изображение в качестве входных данных, все будет намного сложнее. В этом случае вы должны использовать методы обработки изображений.
Я вижу, большое спасибо за вашу помощь, очень ценю это.
Мне не понятно слово "другая форма зеленого". И у меня тоже немного неясный вопрос. Не могли бы вы четко объяснить, что вы на самом деле хотите сделать? пишет образ? Если возможно, опубликуйте код того, что вы пробовали до сих пор... чтобы мы могли быстро понять, что вы пытаетесь сделать.