JavaFX ImageIO.write() не сохраняет измененное BufferedImage

Я пытаюсь создать приложение, которое позволяет пользователям изменять изображения, а затем сохранять их. У меня проблемы с сохранением.

Это метод, который вращает изображение:

public void process(ImageView imageView) {
    if (imageView.getImage() != null){
        BufferedImage img;
        img = Home.img;
        double rads = Math.toRadians(90);
        double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
        int w = img.getWidth();
        int h = img.getHeight();
        int newWidth = (int) Math.floor(w * cos + h * sin);
        int newHeight = (int) Math.floor(h * cos + w * sin);

        BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = rotated.createGraphics();
        AffineTransform at = new AffineTransform();
        at.translate((newWidth - w) / 2, (newHeight - h) / 2);

        int x = w / 2;
        int y = h / 2;

        at.rotate(rads, x, y);
        g2d.setTransform(at);
        g2d.drawImage(img, 0, 0,null);
        g2d.dispose();
        imageView.setImage(convertToFxImage(rotated));
        Home.img = rotated;
    }
}

Он устанавливает изображение в imageView класса контроллера Home, а также устанавливает статическое поле для измененного изображения. Затем я пытаюсь сохранить его внутри класса Home:

savAs.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            File dir = fileChooser.showSaveDialog(opButton.getScene().getWindow());
            if (dir != null) {
                try {
                    ImageIO.write(img, dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3), dir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

Это почему-то не работает. Нет IOException выбрасывается, но не создает никакого файла. Когда я пытаюсь сохранить без изменения изображения, это работает. Есть идеи, почему?

Вам не нужно качаться, чтобы повернуть изображение. Javadoc-представление изображений предоставляет пример поворота изображения. Поверните ImageView, который содержит изображение.

jewelsea 06.05.2022 22:32

Когда вы хотите сохранить его, сделать снимок, конвертировать в BufferedImage, затем записать это в файл.

jewelsea 06.05.2022 22:33

Если у вас все еще есть проблемы, обновите свой вопрос полным исполняемым файлом (путем копирования и вставки) минимальный воспроизводимый пример.

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

Ответы 1

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

Метод в ImageIO, который вы вызываете, указан ниже, и он возвращает логический код состояния, который вы игнорируете:

public static boolean write(RenderedImage im,
                            String formatName,
                            File output) throws IOException

Вы не включили сведения о файле, поэтому невозможно определить, передали ли вы действительное formatName, которое вы получаете из последних трех символов имени выходного файла. Обратите внимание, что formatName не всегда состоит из 3 символов и должен быть в нижнем регистре, поэтому и «FILE.JPG», и «FILE.JPEG» могут не сохраниться.

Если вы считаете, что расширение файла правильное и поддерживается используемым вами форматом BufferedImage.TYPE_INT_ARGB, попробуйте изменить его на использование нижнего регистра, а затем проверьте результат:

String format = dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3).toLowerCase();
boolean ok = ImageIO.write(img, format, dir);
if (!ok)
    throw new RuntimeException("Failed to write "+format+" to " + dir.getAbsolutePath());

Если формат BufferedImage не совместим с расширением файла, попробуйте использовать new BufferedImage(... , BufferedImage.TYPE_INT_RGB) или другой тип формата (например, PNG).

Спасибо! Мне пришлось изменить BufferedImage.TYPE_INT_ARGB на BufferedImage.TYPE_INT_RGB

Bence 07.05.2022 10:31

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