JavaFX Как обрезать изображение один раз для нескольких форматов изображения - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю настольное приложение в JavaFX, которое позволяет пользователю искать людей в разных категориях. Существует экран, который показывает каждую категорию в виде плитки с изображением (соотношение сторон 1: 1). Когда вы нажимаете на плитку, она открывает другую страницу, и изображение с плитки теперь должно отображаться как фоновое изображение (Соотношение сторон 16: 9). Изображения выбираются администратором, поэтому они должны быть обрезаны, поскольку они могут быть слишком большими, иметь неправильное соотношение сторон и т. Д.

Интересно, как настроить простой способ, позволяющий администратору выбирать желаемое изображение без необходимости обрезать изображение дважды (один раз как 1: 1 и один раз как 16: 9). Я думал об кадрировании только до 1: 1, а затем для отображения в формате 16: 9, просто увеличивая изображение, но это приводит к плохому качеству, если разрешение недостаточно высокое.

Для обрезки я ссылаюсь на этот пост от Роланда: Как создать приложение для обработки изображений Javafx

1 Ответ

0 голосов
/ 10 сентября 2018

Для фоновых изображений вы можете просто указать, что изображение должно покрывать Region.

ImageView позволяет указать viewport, позволяя указать область Image, которая должна отображаться. Если выбрано соответствующим образом, это делает обрезку для вас.

В следующем коде для простоты используется одно и то же соотношение:

@Override
public void start(Stage primaryStage) {
    final Image image = new Image(URL);

    // size to use for both nodes
    double targetHeight = 400;
    double targetWidth = targetHeight * 16 / 9;

    ImageView imageView = new ImageView(image);
    imageView.setFitWidth(targetWidth);
    imageView.setFitHeight(targetHeight);

    // calculate viewport
    imageView.setViewport((image.getHeight() / targetHeight < image.getWidth() / targetWidth)
            ? new Rectangle2D(0, 0, image.getHeight() / targetHeight * targetWidth, image.getHeight())
            : new Rectangle2D(0, 0, image.getWidth(), image.getWidth() / targetWidth * targetHeight));

    Region backgroundRegion = new Region();
    backgroundRegion.setPrefSize(targetWidth, targetHeight);
    backgroundRegion.setBackground(new Background(
            new BackgroundImage(
                    image,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundPosition.CENTER,
                    new BackgroundSize(0, 0, false, false, false, true) // cover
            )));

    HBox root = new HBox(imageView, backgroundRegion);
    root.setFillHeight(false);
    root.setPadding(new Insets(20));

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...