Буферизируйте значения ширины и высоты изображения, инвертированные случайным образом


I need to know if an image is landscape oriented or not, for that i´m getting the width and height of a BufferImage but sometimes the values appear as inverted.

This is the code I use to detect if an image is landscape:
public class ProcessImage{
    private static final String IMAGE_ORIENTATION_ERROR ="001";

    public static void main(String[] args) {
        try {

            File file = new File("C:\\myFolder\\nothing.jpg");
            byte[] fileContent = Files.readAllBytes(file.toPath());
            BufferedImage image = createImageFromBytes(fileContent);
            validateImage(image);
            System.out.println(image.getWidth());
        } catch (IOException | ImageOrientationException e) {
            e.printStackTrace();
        }

    }

    private static BufferedImage createImageFromBytes(byte[] imageData) {
        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
        try {
            return ImageIO.read(bais);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /* Here is where i validate if the image is landscape
       But Values of image.getWidth() and image.getHeight() appear as inverted.*/
    private static void validateImage (BufferedImage image)
             throws ImageOrientationException{
         //if this happens the picture is NOT landscape 
         if (image.getWidth() < image.getHeight()) {
            throw new ImageOrientationException(IMAGE_ORIENTATION_ERROR,
                     "error oriented picture");
          }
}

}

  

У меня проблема в том, что для некоторых изображений значения heigth и width инвертированы .
Например, для изображения с шириной 3024 и высотой 4032 значения ширины и высоты, возвращаемые BufferImage, будут width: 4032< /strong> и height:3024. Но если я отредактирую то же изображение в Paint (с учетом исходных размеров), BufferImage вернет width: 3024 и height: 4032 (как и должно быть).
Я протестировал другие изображения с такой же шириной и высотой, и BufferImage получил правильные значения
У вас есть идеи, почему это происходит? Есть ли способ узнать, действительно ли изображение ориентировано на альбомную ориентацию?
Вот ссылка на изображение с проблемой: http://www.mediafire.com/file/n1a8uhy195zgesd/nothing.jpg/file
Заранее спасибо!


person Vanesa C.    schedule 29.10.2020    source источник
comment
Изображения могут содержать метаданные. Одна вещь, которая иногда сохраняется в метаданных, — это ориентация изображения. Что может случиться, так это то, что Paint знает, что нужно соблюдать ориентацию, указанную в файле, и для проблемного изображения эта ориентация отличается от того, как данные хранятся в файле. Таким образом, Paint поворачивает изображение перед его отображением из-за метаданных, но когда вы считываете изображение в BufferImage, вы получаете пиксели в том виде, в котором они фактически хранятся в файле. Просто предположение .... возможность.   -  person CryptoFool    schedule 30.10.2020
comment
Взгляните на это: stackoverflow.com/questions/5905868/   -  person CryptoFool    schedule 30.10.2020
comment
Спасибо @Steve! Этот пост действительно полезен!   -  person Vanesa C.    schedule 30.10.2020