Почему изображения, предоставляемые API изображений Google Appengine, не ориентированы правильно? - PullRequest
0 голосов
/ 11 июля 2019

Если вы создаете изображение с помощью AppEngine Images API , выходное изображение не имеет Exif. Если исходное изображение имеет флаг ориентации, установленный в Exif, оно не сохраняется в выходном изображении и поэтому будет отображаться повернутым для пользователя.

Есть ли способ указать ImagesServiceFactory, чтобы он передавал Exif на выходное изображение?

1 Ответ

0 голосов
/ 11 июля 2019

Лучший способ, который я нашел до сих пор, - это просто прочитать флаг ориентации, используя анализатор Exif java , а затем применить преобразование поворота к сгенерированному изображению, чтобы пиксели фактически вращались. Вот упрощенный пример:

byte[] sourceImage = yourCode();

int orientation = 1;
try {
    Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(sourceImage));
    orientation = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class).getInt(ExifIFD0Directory.TAG_ORIENTATION);
} catch (Throwable t) {
    log.log(Level.INFO, "Failed to extract orientation", t);
}

Image destinationImage = ImagesServiceFactory.makeImage(sourceImage);
Transform rotate;

switch (orientation) {
    case (EXIF_ORIENTATION_90): {
        rotate = ImagesServiceFactory.makeRotate(90);
        break;
    }
    case (EXIF_ORIENTATION_180): {
        rotate = ImagesServiceFactory.makeRotate(180);
        break;
    }
    case (EXIF_ORIENTATION_270): {
        rotate = ImagesServiceFactory.makeRotate(270);
        break;
    }
    default:
        rotate = ImagesServiceFactory.makeRotate(0); // anything else, no rotate
}
destinationImage = ImagesServiceFactory.getImagesService().applyTransform(rotate, destinationImage);

final byte[] destinationImageData = destinationImage.getImageData();

Этого должно быть достаточно, чтобы вы пошли. Возможные значения ориентации Exif (если есть):

1 = Horizontal (normal) 
2 = Mirror horizontal 
3 = Rotate 180 
4 = Mirror vertical 
5 = Mirror horizontal and rotate 270 CW 
6 = Rotate 90 CW 
7 = Mirror horizontal and rotate 90 CW 
8 = Rotate 270 CW

Я бы предпочел не делать этого, так как это требует ненужного преобразования и дополнительного шага разбора Exif. Лучшие решения приветствуются:)

...