Копирование изображения и сохранение ориентации? - PullRequest
0 голосов
/ 03 ноября 2018

Редактировать Оказывается, что второй фрагмент действительно работает, но рассматриваемые изображения по-прежнему неправильно отображаются в моей IDE (IntelliJ IDEA) по некоторым причинам.

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

    try {
        final Image image = ImageIO.read(file);
        int w = ((BufferedImage) image).getWidth();
        int h = ((BufferedImage) image).getHeight();

        final BufferedImage finalImage = 
            new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

        //Graphics2D g = finalImage.createGraphics();
        Graphics2D g = (Graphics2D) finalImage.getGraphics();
        g.drawImage(image, 0, 0, null);
        g.drawImage(watermark, 0, 0, null);
        g.dispose();

        File outputFile = new File("watermarked/" + folderName + "/" + file.getName());
        outputFile.mkdirs();

        ImageIO.write(finalImage, "jpg", outputFile);


    } catch (IOException e) {
        // TODO: notify client
        e.printStackTrace();
    }

После некоторого чтения я узнал, что ImageIO.read(...) не поддерживает ориентацию или другие «метаданные» изображения, которое он обрабатывает. Я также читал об использовании ImageReader для извлечения метаданных. Согласно документам, использование ImageReader.readall () должно включать метаданные в возвращаемое изображение IIOImage, но я все равно получаю некоторые мои изображения вверх ногами. Приведенный ниже код демонстрирует копирование без добавления водяного знака.

    File out = new File("watermarked/" + folderName + "/" + file.getName());
    out.getParentFile().mkdirs();

    ImageInputStream input = ImageIO.createImageInputStream(file);
    ImageOutputStream output = ImageIO.createImageOutputStream(out);

    Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
    ImageReader reader = readers.next();
    reader.setInput(input);

    IIOImage image = reader.readAll(0, null);
    // Should not be needed since readAll should already take care of it.
    IIOMetadata metadata = reader.getImageMetadata(0);
    image.setMetadata(metadata);

    ImageWriter writer = ImageIO.getImageWriter(reader);
    writer.setOutput(output);
    writer.write(image);


    System.out.println(writer.canReplaceImageMetadata(0)); // Returns false
    writer.replaceImageMetadata(0, metadata); // Results in a "Unsupported write variant" error.

Оба фрагмента кода находятся в методе, который получает folderName в виде строки и фактическое изображение file.

Редактировать

Приведенный выше фрагмент работает, и проблема в другом. В моей папке Windows все мои изображения, сделанные с Galaxy S8, отображаются в правильной ориентации. Но когда я копирую их в свой проект и открываю их в IntelliJ IDEA, некоторые ориентируются по-другому. Поэтому я добавил sanselan в качестве зависимости, чтобы лучше понять метаданные изображений, и изображения, которые имеют различную ориентацию в IDE, действительно показывают другую ориентацию в метаданных. Но почему они не ориентированы таким образом в папке Windows, мне не хватает поля метаданных или окна хранят дополнительные данные где-то за пределами метаданных изображения?

...