GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.

introduction

Auparavant, j'ai essayé de faire pivoter l'image côté serveur en utilisant PIL et cela a échoué. La cause est l'erreur suivante

".../PIL-1.1.7/PIL/ImageFile.py", line 476, in _save
    fh = fp.fileno()
UnsupportedOperation: fileno

Il semble y avoir un problème avec fileno (). Si vous effectuez une recherche sur Internet, vous pouvez voir d'autres personnes qui sont aux prises avec cette erreur. Je ne suis pas sûr de cette erreur.

Donc, cette fois, comme plan pour surmonter cela, je vais essayer de le faire pivoter côté serveur en utilisant ** l'API Images Python ** de GAE.

** Qu'est-ce que l'API Python Images ** Une fonction pour exploiter les données d'image fournies par AppEngine. Vous pouvez redimensionner, faire pivoter, retourner et rogner l'image. L'API peut également extraire des informations sur l'image, telles que le format, la largeur, la hauteur et l'histogramme de valeur de couleur. Vous pouvez recevoir des données de l'application ou utiliser les valeurs de Google Cloud Storage. En plus de l'API Images, vous pouvez également utiliser les transformations fournies par la ** Python Imaging Library (PIL) ** de Python 2.7. (Pour plus de détails, cliquez ici](https://cloud.google.com/appengine/docs/standard/python/images/))

Obtenir EXIF

Importation d'API

from google.appengine.api import images

Ouvrez base64 avec l'API Image

binary = base64.b64decode(base64_string)
gae_img = images.Image(binary)

Obtenir des informations

J'obtiendrai des informations EXIF à partir d'ici, mais lorsque je les reçois en utilisant l'API Image Python, j'obtiens une erreur si je ne suis pas les étapes ci-dessous.

# 1.Quelques traitements sur l'image(conversion)
gae_img.rotate(0)
# 2.Effectuer la conversion en image
gae_img.execute_transforms(parse_source_metadata=True)
# 3.Obtenir des informations EXIF
exif = gae_img.get_original_metadata()

Pour expliquer pas à pas, je voudrais tout à coup obtenir des informations EXIF avec gae_img.get_original_metadata (), mais pour ce faire, utilisez gae_img.execute_transforms (parse_source_metadata = True) pour obtenir les métadonnées de l'image source (EXIF). Besoin d'être analysé. Comme mentionné ci-dessus, ce gae_img.execute_transforms () est une méthode pour "effectuer une transformation sur une image", donc avant de faire cela, "en supposant que l'image a été transformée" y a-t-il. Donc, avant cela, j'ai délibérément écrit un processus apparemment dénué de sens appelé gae_img.rotate (0). Ce gae_img.rotate () sera expliqué plus tard.

Jusqu'à présent, print exif

{u'MimeType': 0, u'ColorProfile': False, u'Orientation': 6, u'ColorSpace': 1, u'ImageWidth': 3264, u'ImageLength': 2448}

Vous pouvez voir qu'il s'agit d'un type de dictionnaire. L'orientation de l'image peut être jugée par l'élément "Orientation".

print exif['Orientation']
# "1"De"8"N'importe lequel des nombres jusqu'à est émis.

Vous pouvez maintenant obtenir les informations EXIF.

Faites pivoter l'image en fonction des informations EXIF

Je vais résumer ce que j'ai fait jusqu'à présent.

from google.appengine.api import images

binary = base64.b64decode(base64_string)
gae_img = images.Image(binary)

gae_img.rotate(0)
gae_img.execute_transforms(parse_source_metadata=True)
exif = gae_img.get_original_metadata()

À partir de là, faites pivoter l'image en fonction de «Orientation» dans «exif».

if exif['Orientation'] == 3:
    gae_img.rotate(180)
elif exif['Orientation'] == 6:
    gae_img.rotate(90)
elif exif['Orientation'] == 8:
    gae_img.rotate(270)
else : 
    gae_img.rotate(0)

converted_img = gae_img.execute_transforms(parse_source_metadata=True)

Vous pouvez faire pivoter l'image de 90 degrés avec gae_img.rotate (). Comme mentionné ci-dessus, en raison de la nature de gae_img.execute_transforms (), une erreur se produira si l'image n'est pas convertie une fois, donc ʻelse` est utilisé pour effectuer la conversion une fois.

Cette fois, je ne pense pas que les images retournées ou retournées horizontalement ne seront pas envoyées, donc le traitement pour 2,4,5,7 n'est pas écrit. Ensuite, après la rotation, exécutez gae_img.execute_transforms (parse_source_metadata = True) pour exécuter les modifications apportées à l'image.

Télécharger sur Cloud Storage

À partir de là, téléversez sur Cloud Storage. Comme procédure

  1. Déterminer les variables d'environnement
  2. Ouvrez le fichier dans un emplacement adapté à votre environnement
  3. Écrivez à la destination ouverte (téléchargement) Ça ressemble à ça. Jetons un coup d'œil au code.
import cloudstorage as gcs

def upload_gcs(self, name, type, binary):
    #Extraire les variables d'environnement
    env = os.getenv('SERVER_SOFTWARE')
    #Importer sur Google Cloud Storage dans n'importe quel environnement
    if (env and (env.startswith('Google App Engine/') or env.startswith('Development/'))):
        # FileLogic.GCS_L'ID contient une URL qui indique l'emplacement à enregistrer.
        file_url = FileLogic.GCS_ID + name
        #Ouvrir le fichier avec l'API Google Cloud Storage
        with gcs.open(file_url, 'w', content_type=type, options={'x-goog-acl': 'public-read'}) as gcs_file:
            #Écriture (téléchargement) d'images
            gcs_file.write(binary)
            # FileLogic.GCS_HOST_Le nom d'hôte est pré-rempli dans NAME
            file_url = FileLogic.GCS_HOST_NAME + file_url
    else:
        #Écrivez localement si ce n'est dans n'importe quel environnement
        file_url = 'local_file/' + name
        with open(file_url, 'w') as file:
            file.write(binary)
    return file_url

Ouvrez avec l'API Google Cloud Storage pour ouvrir un objet existant dans un bucket Cloud Storage. À ce stade, vous pouvez ouvrir le fichier en mode écriture en passant `` w ''. Après avoir ouvert n'importe quel emplacement en mode écriture, téléchargez l'image avec write.

Recommended Posts

GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[Python] Modifier le contrôle du cache des objets téléchargés sur Cloud Storage
Comment télécharger des fichiers sur Cloud Storage avec le SDK Python de Firebase
POSTEZ l'image sélectionnée sur le site Web avec multipart / form-data et enregistrez-la sur Amazon S3! !!
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Importation et téléchargement d'images sur le stockage Azure. Avec Python + requêtes + API REST
Convertissez le résultat de python optparse en dict et utilisez-le
Comment mettre à jour la version Python de Cloud Shell dans GCP
Télécharger le fichier sur Cloud Storage (GCS) de GCP ~ Charger avec Python local
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Note de travail pour migrer et mettre à jour les scripts de la série Python 2 sur le cloud vers la série 3
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Essayez de mesurer la position d'un objet sur le bureau (système de coordonnées réel) à partir de l'image de la caméra avec Python + OpenCV
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
Introduction à Python avec Atom (en route)
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Obtenez des informations équivalentes à l'onglet Réseau des outils de développement Chrome avec Python + Selenium
Je veux tracer les informations de localisation de GTFS Realtime sur Jupyter! (Avec ballon)
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Un moyen simple de remplir le début de 0 en fonction du nombre de chiffres dans le nombre [Python]
Essayez de normaliser Coupez l'image avec scikit-image (bien qu'elle se fâche en chemin)
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
À partir de Python 3.10, le formulaire retourné par inspect.signature () semble être basé sur typing.get_type_hints ().
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Extraire le tableau des fichiers image avec OneDrive et Python
Ajoutez des informations au bas de la figure avec Matplotlib
Installez le sélénium sur votre Mac et essayez-le avec python
Visualisez la gamme d'insertions internes et externes avec python
Convertissez l'image au format .zip en PDF avec Python
Informations pour contrôler les moteurs avec Python sur RaspberryPi
Utilisation de Google Cloud Storage (GCS) par "GAE / Py"
[Maintenance de l'environnement Python] De-NeoBundle. Préparez l'environnement du plug complémentaire super pratique jedi-vim avec dein et réglez-le pour qu'il soit confortable
Comment générer le nombre de vues, de likes et de stocks d'articles publiés sur Qiita au format CSV (créé avec "Python + Qiita API v2")
[Python] Enregistrez le résultat du scraping Web de la page produit Mercari sur Google Colab dans une feuille de calcul Google et affichez également l'image du produit.
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
Utilisez Python pour surveiller Windows et Mac et collecter des informations sur les applications sur lesquelles vous travaillez
Récupérez la chaîne correspondante dans l'expression régulière et réutilisez-la lors du remplacement sur Python3
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Comment connaître le nombre de GPU de python ~ Remarques sur l'utilisation du multitraitement avec pytorch ~