Redimensionnement d'image avec django?
Je suis nouveau sur Django (Python) et j'ai essayé de travailler un certain nombre de choses moi-même, avant de sauter dans l'utilisation des autres applications. Je vais avoir du mal à comprendre où les choses s'adapter à la Django (ou Python) façon de faire les choses. Ce que je suis en train de travailler sur est de savoir comment redimensionner une image, une fois qu'il est téléchargé. J'ai mon modèle de configuration joliment et branché dans l'admin, et l'image uploads amende pour le répertoire:
from django.db import models
# This is to list all the countries
# For starters though, this will be just United Kingdom (GB)
class Country(models.Model):
name = models.CharField(max_length=120, help_text="Full name of country")
code = models.CharField(max_length=2, help_text="This is the ISO 3166 2-letter country code (see: http://www.theodora.com/country_digraphs.html)")
flag = models.ImageField(upload_to="images/uploaded/country/", max_length=150, help_text="The flag image of the country.", blank=True)
class Meta:
verbose_name_plural = "Countries"
def __unicode__(self):
return self.name
La chose dont je suis maintenant avoir des ennuis avec, est de prendre le fichier et d'en faire un nouveau fichier dans une vignette. Comme je l'ai dit, j'aimerais savoir comment le faire sans l'aide des autres applications (pour l'instant). J'ai eu ce code de DjangoSnippets:
from PIL import Image
import os.path
import StringIO
def thumbnail(filename, size=(50, 50), output_filename=None):
image = Image.open(filename)
if image.mode not in ('L', 'RGB'):
image = image.convert('RGB')
image = image.resize(size, Image.ANTIALIAS)
# get the thumbnail data in memory.
if not output_filename:
output_filename = get_default_thumbnail_filename(filename)
image.save(output_filename, image.format)
return output_filename
def thumbnail_string(buf, size=(50, 50)):
f = StringIO.StringIO(buf)
image = Image.open(f)
if image.mode not in ('L', 'RGB'):
image = image.convert('RGB')
image = image.resize(size, Image.ANTIALIAS)
o = StringIO.StringIO()
image.save(o, "JPEG")
return o.getvalue()
def get_default_thumbnail_filename(filename):
path, ext = os.path.splitext(filename)
return path + '.thumb.jpg'
...mais cela a finalement confondu moi... Comme je ne sais pas comment cela s'inscrit dans " mon Django app? Et vraiment, est-il la meilleure solution pour rendre tout simplement une vignette d'une image qui a été téléchargée avec succès? Quelqu'un peut éventuellement m'indiquer une bonne et solide, de façon décente qu'un débutant comme moi peut apprendre à le faire correctement? Comme, en sachant où mettre ce genre de code (models.py? forms.py? ...) et comment cela pourrait fonctionner dans le contexte? ... J'ai juste besoin d'un peu d'aide pour comprendre et travailler ce problème.
Merci!
source d'informationauteur littlejim84
Vous devez vous connecter pour publier un commentaire.
Si c'est OK pour vous, il y a une application Django prêt, à faire exactement ce que vous voulez:
https://github.com/sorl/sorl-thumbnail
C'est ce que j'utilise dans mes modèles pour enregistrer une nouvelle vignette si le téléchargement de l'image a changé. C'est en fonction d'un autre DjangoSnippet mais je ne me souviens pas qui a écrit à l'origine - si vous savez, merci d'ajouter un commentaire afin que je puisse crédit.
Une question clé est: quand devrait la vignette être généré?
Si (1) je vous suggère de créer une vue qui correspond à l'url
/flagthumbnail/countryid
. La méthode de vue serait alors:Quand vous en avez besoin pour afficher une vignette drapeau, il suffit d'utiliser
<a href="/flagthumbnail/countryid">
.Si (2), vous pouvez vous connecter à Django
django.db.models.signals.post_save
signal et dans le gestionnaire de signal créer et enregistrer un fichier miniature.Je suppose que cela dépend sur comment et quand vous utilisez vos vignettes.
Si vous voulez créer des vignettes de tous les temps, le Pays est enregistré, vous pouvez le faire comme ceci:
Si vous n'êtes pas 100% sûr de ce que les tailles que vous aurez besoin de vos images, vous pouvez les redimensionner à la dernière minute. J'ai vu ce fait, avec un templatetag (je crois en une version sur Pinax). Vous créez un templatetag que prend l'image et une taille, puis de créer et d'enregistrer l'image de la taille appropriée, si besoin est, ou afficher un déjà créé un si il y est. Il fonctionne assez bien.
Substitution de la méthode save est une bonne option, mais je serais plus tenté d'utiliser un signal dans ce cas. Django signaux de vous permettre de vous "écouter" pour un modèle de ce type de manifestations diverses; dans ce cas, vous seriez intéressé à la
post_save
événement.J'ai l'habitude de souscrire à de tels signaux dans mon
models.py
fichier. Le Code devrait ressembler à quelque chose comme ceci:Ryan est de corriger les signaux sont une meilleure façon d'aller toutefois l'avantage de le remplacé enregistrer, c'est que l'on peut obtenir l'ancienne et de la nouvelle image de chemins, de voir si l'image a changé (et si il a créer une nouvelle vignette), enregistrez le modèle de l'instance et ensuite supprimer l'ancienne image et miniature.
Souvenir de django ne pas nettoyer les anciennes images pour vous donc, sauf si vous avez un script pour vérifier que les images/vignettes sont toujours en cours d'utilisation et à nettoyer tout ce que vous n'avez pas de fuite de l'espace disque. (Cela peut ou peut ne pas être un problème pour vous en fonction de la taille de l'image et de la fréquence des mises à jour)
Je ne suis pas sûr de savoir comment vous pouvez le faire avec un post_save signal, et je ne sais pas assez sur les signaux (Qui est à la recherche pour ce soir!) pour savoir si il y a une pre_save signal. Si j'en trouve un, alors je vais ré-écrire le code ci-dessus pour utiliser des signaux en tant que générique de pré enregistrer listner.
Vous pouvez essayer:
image headcut
caractéristiques:
Pas de doute sur le code que vous avez envoyé, car je n'ai jamais utiliser les Modèles en tant que tel, mais il existe une autre méthode.
Vous pouvez implémenter votre propre
FileUploadHandler
pour la manipulation de l'image de téléchargement de fichiers. Exempleici.
Juste après la ligne 37 (
dest.close()
) utilisationthumbnail(upload_dir + upload.name)
fonction (celle que vous avez envoyée).Espère que cela vous aide.
Une autre alternative est d'utiliser Imagemagick directement, si vous voulez éviter de nombreuses difficultés avec Oreiller et Python 3 comme cette une.
On pourrait appeler cela sur le modèle de l'enregistrer, ou sur une balise de modèle pour générer un one-off manipulé copie du fichier d'origine dans un fichier de mise en cache de la mode, ou même un céleri tâche.
Vous pouvez obtenir un exemple de la façon dont j'ai utilisé un de mes projets:
J'ai aussi ne jurent que par Justin Driscoll django-photologue est également grand pour le redimensionnement. C':
En gros, c'est génial.
Un moyen très facile est de redimensionner et/ou de recadrer l'image sur votre écran avec django-imagefit.
Il permettra de préserver l'image d'origine de sorte que vous pouvez avoir plusieurs versions, refactoriser votre frontend plus tard et il fonctionne aussi avec les non-modèle d'images.