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/))
from google.appengine.api import images
binary = base64.b64decode(base64_string)
gae_img = images.Image(binary)
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.
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.
À partir de là, téléversez sur Cloud Storage. Comme procédure
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