GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.

Einführung

Zuvor habe ich versucht, das Image mit PIL auf der Serverseite zu drehen, aber es ist fehlgeschlagen. Die Ursache ist der folgende Fehler

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

Mit fileno () scheint etwas nicht zu stimmen. Wenn Sie im Internet suchen, können Sie andere Personen sehen, die mit diesem Fehler zu kämpfen haben. Ich bin mir über diesen Fehler nicht sicher.

Um dies zu überwinden, werde ich dieses Mal versuchen, es auf der Serverseite mithilfe der ** Images Python API ** von GAE zu drehen.

** Was ist Images Python API ** Eine Funktion zum Bedienen von Bilddaten, die von AppEngine bereitgestellt werden. Sie können das Bild in der Größe ändern, drehen, spiegeln und zuschneiden. Die API kann auch Informationen zum Bild extrahieren, z. B. Format, Breite, Höhe und Farbwerthistogramm. Sie können Daten von der App empfangen oder Google Cloud Storage-Werte verwenden. Zusätzlich zur Images-API können Sie auch die Transformationen verwenden, die von Python 2.7s ** Python Imaging Library (PIL) ** bereitgestellt werden. (Für Details klicken Sie hier](https://cloud.google.com/appengine/docs/standard/python/images/))

EXIF erhalten

API-Import

from google.appengine.api import images

Öffnen Sie base64 mit der Image-API

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

Informationen bekommen

Ich erhalte von hier EXIF-Informationen, aber wenn ich sie über die Image Python-API erhalte, wird eine Fehlermeldung angezeigt, wenn ich die folgenden Schritte nicht befolge.

# 1.Einige Verarbeitung auf dem Bild(Umwandlung)
gae_img.rotate(0)
# 2.Konvertierung in Bild durchführen
gae_img.execute_transforms(parse_source_metadata=True)
# 3.Holen Sie sich EXIF-Informationen
exif = gae_img.get_original_metadata()

Um Schritt für Schritt zu erklären, möchte ich EXIF-Informationen plötzlich mit gae_img.get_original_metadata () abrufen. Verwenden Sie dazu jedoch gae_img.execute_transforms (parse_source_metadata = True), um die Quellbild-Metadaten (EXIF) abzurufen. Muss analysiert werden. Wie oben erwähnt, ist dieses "gae_img.execute_transforms ()" eine Methode zum "Durchführen einer Transformation für ein Bild". Bevor Sie dies tun, "unter der Annahme, dass das Bild transformiert wurde". Gibt es. Vorher habe ich absichtlich einen scheinbar bedeutungslosen Prozess namens "gae_img.rotate (0)" geschrieben. Diese gae_img.rotate () wird später erklärt.

Bisher print exif

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

Sie können sehen, dass es sich um einen Wörterbuchtyp handelt. Die Ausrichtung des Bildes kann anhand des Punktes "Ausrichtung" beurteilt werden.

print exif['Orientation']
# "1"Von"8"Jede der Zahlen bis wird ausgegeben.

Jetzt können Sie die EXIF-Informationen erhalten.

Drehen Sie das Bild basierend auf EXIF-Informationen

Ich werde zusammenfassen, was ich bisher getan habe.

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()

Drehen Sie von hier aus das Bild basierend auf der "Ausrichtung" im "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)

Sie können das Bild mit gae_img.rotate () um 90 Grad drehen. Wie oben erwähnt, tritt aufgrund der Natur von "gae_img.execute_transforms ()" ein Fehler auf, wenn das Bild nicht einmal konvertiert wird, sodass die Konvertierung einmal mit "else" durchgeführt wird.

Dieses Mal glaube ich nicht, dass die Bilder, die auf den Kopf gestellt oder horizontal gespiegelt werden, nicht gesendet werden, sodass die Verarbeitung für 2,4,5,7 nicht geschrieben wird. Führen Sie dann nach dem Drehen "gae_img.execute_transforms (parse_source_metadata = True)" aus, um die am Bild vorgenommenen Änderungen auszuführen.

In den Cloud-Speicher hochladen

Von hier aus in den Cloud-Speicher hochladen. Als Prozedur

  1. Umgebungsvariablen bestimmen
  2. Öffnen Sie die Datei an einem für Ihre Umgebung geeigneten Ort
  3. Schreiben Sie an das geöffnete Ziel (Upload) Es sieht aus wie das. Werfen wir einen Blick auf den Code.
import cloudstorage as gcs

def upload_gcs(self, name, type, binary):
    #Umgebungsvariablen extrahieren
    env = os.getenv('SERVER_SOFTWARE')
    #In jeder Umgebung auf Google Cloud Storage hochladen
    if (env and (env.startswith('Google App Engine/') or env.startswith('Development/'))):
        # FileLogic.GCS_Die ID enthält eine URL, die den Speicherort angibt.
        file_url = FileLogic.GCS_ID + name
        #Datei mit Google Cloud Storage API öffnen
        with gcs.open(file_url, 'w', content_type=type, options={'x-goog-acl': 'public-read'}) as gcs_file:
            #Bilder schreiben (hochladen)
            gcs_file.write(binary)
            # FileLogic.GCS_HOST_Der Hostname ist in NAME vorab ausgefüllt
            file_url = FileLogic.GCS_HOST_NAME + file_url
    else:
        #Schreiben Sie lokal, wenn nicht in einer Umgebung
        file_url = 'local_file/' + name
        with open(file_url, 'w') as file:
            file.write(binary)
    return file_url

Öffnen Sie mit der Google Cloud Storage-API, um ein vorhandenes Objekt in einem Cloud Storage-Bucket zu öffnen. Zu diesem Zeitpunkt können Sie die Datei im Schreibmodus öffnen, indem Sie "w" übergeben. Laden Sie das Bild mit "Schreiben" hoch, nachdem Sie einen Ort im Schreibmodus geöffnet haben.

Recommended Posts

GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Konvertieren Sie eine Tabelle in CSV und laden Sie sie mit Cloud-Funktionen in den Cloud-Speicher hoch
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
Hochladen von Dateien in den Cloud-Speicher mit dem Python-SDK von Firebase
POST das ausgewählte Bild auf der Website mit mehrteiligen / Formulardaten und speichere es in Amazon S3! !!
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Hochladen und Herunterladen von Bildern in Azure Storage. Mit Python + Anfragen + REST API
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Laden Sie Dateien in den Cloud Storage (GCS) von GCP hoch. ~ Laden Sie mit lokalem Python
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Arbeitsnotiz zum Migrieren und Aktualisieren von Skripten der Python 2-Serie in der Cloud auf 3-Serien
Ich habe GhostScript mit Python ausgeführt, das PDF in Seiten aufgeteilt und es in ein JPEG-Bild konvertiert.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
[Python] Senden Sie das von der Webkamera aufgenommene Bild an den Server und speichern Sie es
Lesen Sie die Daten des NFC-Lesegeräts, das mit Python an Raspberry Pi 3 angeschlossen ist, und senden Sie sie mit OSC an openFrameworks
So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen
Versuchen Sie, die Position eines Objekts auf dem Schreibtisch (reales Koordinatensystem) anhand des Kamerabilds mit Python + OpenCV zu messen
Verwenden Sie Pillow, um das Bild transparent zu machen und nur einen Teil davon zu überlagern
Einführung in Python mit Atom (unterwegs)
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Mit Python + Selenium erhalten Sie Informationen, die der Registerkarte "Netzwerk" der Chrome-Entwicklertools entsprechen
Ich möchte die Standortinformationen von GTFS Realtime auf Jupyter zeichnen! (Mit Ballon)
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Einfache Möglichkeit, 0 abhängig von der Anzahl der Ziffern vorangestellt [Python]
Versuchen Sie zu normalisieren Schneiden Sie das Bild mit einem Scikit-Bild aus (obwohl es unterwegs wütend wird)
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ab Python 3.10 scheint das von inspect.signature () zurückgegebene Formular auf typing.get_type_hints () zu basieren.
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Konvertieren Sie das Bild in .zip mit Python in PDF
Informationen zur Steuerung von Motoren mit Python auf RaspberryPi
Nutzung von Google Cloud Storage (GCS) durch "GAE / Py"
[Wartung der Python-Umgebung] De-NeoBundle. Bereiten Sie die Umgebung des super praktischen Komplementärsteckers jedi-vim mit dein vor und stellen Sie ihn so ein, dass er bequem ist
So geben Sie die Anzahl der ANSICHTEN, Likes und Bestände von Artikeln aus, die in Qiita an CSV gesendet wurden (erstellt mit "Python + Qiita API v2")
[Python] Speichern Sie das Ergebnis des Web-Scrapings der Mercari-Produktseite in Google Colab in einer Google-Tabelle und zeigen Sie auch das Produktbild an.
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Verwenden Sie Python, um Windows und Mac zu überwachen und Informationen zu den Apps zu sammeln, an denen Sie arbeiten
Holen Sie sich die passende Zeichenfolge in den regulären Ausdruck und verwenden Sie sie beim Ersetzen unter Python3 erneut
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~