[Java / Kotlin] Redimensionner en tenant compte de l'orientation de l'image

Aperçu

--Lorsque vous créez une image avec l'appareil photo de l'iPhone, l'orientation de l'image est enregistrée dans l'orientation EXIF. --EXIF peut être confirmé avec la commande ʻidentify` d'imagemagic.

$ identify -verbose IMG_1046.png | grep Orient
  Orientation: TopLeft

--EXIF doit être pris en compte lors du redimensionnement de l'image.

Bibliothèque à utiliser

la mise en oeuvre

build.gradle


dependencies {
    ...
    implementation "com.sksamuel.scrimage:scrimage-core:4.0.4"
    ...
}

ImageResizer.kt


object ImageResizer {
    enum class ImageFormat {
        JPEG,
        PNG;

        companion object {
            fun fromName(formatName: String): ImageFormat? {
                return when (formatName) {
                    "jpg", "jpeg" -> JPEG
                    "png" -> PNG
                    else -> null
                }
            }
        }
    }

    /**
     *Long côté[size]Et redimensionner
     *
     *Le côté long est[size]S'il est plus petit que, ne redimensionnez pas
     */
    fun resize(inputStream: InputStream, size: Int, formatName: String): File {
        //Lire le fichier original
        val original = ImmutableImage.loader().fromStream(inputStream)
        val originalWidth = original.width.toDouble()
        val originalHeight = original.height.toDouble()

        if (originalWidth <= size && originalHeight <= size) {
            //Si le côté long est plus petit que la taille, ne redimensionnez pas
            return createImageTempFile(original, formatName)
        }

        val resizedWidth: Double
        val resizedHeight: Double
        if (originalWidth > originalHeight) {
            resizedWidth = size.toDouble()
            resizedHeight = size * originalHeight / originalWidth
        } else {
            resizedHeight = size.toDouble()
            resizedWidth = size * originalWidth / originalHeight
        }

        val resized = original.fit(resizedWidth.roundToInt(), resizedHeight.roundToInt())
        return createImageTempFile(resized, formatName)
    }

    private fun createImageTempFile(image: ImmutableImage, formatName: String): File {
        val format = ImageFormat.fromName(formatName)
            ?: throw BadRequestException("The image format $formatName is not supported ")
        val outFile = createTempFile(suffix = ".$formatName")
        when (format) {
            ImageFormat.JPEG -> image.output(JpegWriter(), outFile)
            ImageFormat.PNG -> image.output(PngWriter(), outFile)
        }
        return outFile
    }
}

Cela créera une image redimensionnée avec l'orientation correcte (l'orientation EXIF sera perdue de l'image redimensionnée)

Remarques

référence

Recommended Posts

[Java / Kotlin] Redimensionner en tenant compte de l'orientation de l'image
Veuillez noter la division (division) de java kotlin Int et Int
L'illusion de l'orientation objet
[Java] Supprimer les éléments de la liste
[Édition Java] Histoire de la sérialisation
Génériques Kotlin pour les développeurs Java
L'origine des expressions Java lambda
Afficher le texte en haut de l'image
Obtenez le résultat de POST en Java
Vérifiez le contenu du magasin de certificats Java
Examiner l'utilisation de la mémoire des éléments Java
[Java] Obtenez le jour d'un jour spécifique
Mémo: [Java] Vérifiez le contenu du répertoire
À propos de la classification et du concept de Immutable / Mutable / Const / Variable de Java et Kotlin.
Comparer les éléments d'un tableau (Java)
[jour: 5] J'ai résumé les bases de Java
Quelles sont les fonctionnalités mises à jour de Java 13
Mesurez facilement la taille des objets Java
Retour sur les bases de Java
Sortie du livre "Introduction à Java"
L'histoire de l'écriture de Java dans Emacs
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] [Spring] Tester le comportement de l'enregistreur
[Java] Récupère MimeType à partir du contenu du fichier avec Apathce Tika [Kotlin]
AndroidStudio Faisons référence au C ++ dans le module des autres projets (Java / kotlin)
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
JAVA: jar, aar, affichez le contenu du fichier
L'histoire de la fabrication d'un Othello ordinaire à Java
[Android] [Java] Gérer l'état de CheckBox de ListView
A propos de l'ordre de description des propriétés système Java
L'ordre des modificateurs de méthode Java est fixe
[Java] Accéder à l'URL signée de s3 (version signée 2)
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
[Java] Obtenir la longueur de la chaîne de paire de substitution
[Java] La partie déroutante de String et StringBuilder
[Note] Java: mesure la vitesse de concaténation de chaînes
J'ai comparé les caractéristiques de Java et .NET
[Java] Faites attention au type de clé de la carte
Ressentez le passage du temps même à Java
Calculer le score de similarité des chaînes de caractères avec JAVA
Essayez une recherche similaire de recherche d'images à l'aide du SDK Java [Recherche]
Essayez Progate Free Edition [Java II]
La date et l'heure de java8 ont été mises à jour
Modifier le dossier de placement de l'image et du conteneur Docker
Importer des fichiers de la même hiérarchie en Java
Première touche de la classe Files (ou Java 8)
Java Bienvenue dans le marais des tableaux bidimensionnels
Essayez Progate Free Edition [Java I]
[Java] Présentation de Java
[Java] Comment obtenir l'URL de la source de transition
Obtenez l'URL de la destination de la redirection HTTP en Java
[Lire Java efficace] Chapitre 3 Point 12 "Considérer l'implémentation de Comparable"
Comment écrire Scala du point de vue de Java
La comparaison d'énumération est ==, et equals est bonne [Java]
[Java] Vérifiez la version JDK du fichier war construit
[Pour les débutants] Comprendre rapidement les bases de Java 8 lambda