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/))
from google.appengine.api import images
binary = base64.b64decode(base64_string)
gae_img = images.Image(binary)
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.
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.
Von hier aus in den Cloud-Speicher hochladen. Als Prozedur
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.