Редактировать
Оказывается, что второй фрагмент действительно работает, но рассматриваемые изображения по-прежнему неправильно отображаются в моей 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, мне не хватает поля метаданных или окна хранят дополнительные данные где-то за пределами метаданных изображения?