[Python-es] Crop + Thumbnail
Hubermann
hubermann en gmail.com
Sab Sep 3 05:35:47 CEST 2011
Muchas gracias por las respuestas.
bueno estuve mirando algo del codigo y googleando y me empece a hacer una funcion para lo que quiero.
me quedan un par de cosas que no logro hacer funcionar:
quisiera poder sacar el nombre de la imagen que estoy usando pero no me permite sacar solo el nombre (nose q funcion se usa)
quiero editar el nombre para reemplazar espacios por guion medio
mi foto de un auto .jpg x mi-foto-de-un-auto.jpg
tambien quiero ver de q forma generar un random de unos 6 digitos para agregar al nombre apra evitar duplicados, con base64 vi que generar todo un random enorme de digitos pero no lo veo optimo para SEO
#thumbnail (ad42643 seria el random)
mi-foto-de-un-auto_ad42643_thumb_200.jpg
#foto orig
mi-foto-de-un-auto_ad42643_700.jpg
Saludos y gracias!
######
from PIL import Image
import random
"""
Author: Gabriel Hubermann
Web: www.hubermann.com
GTalk:hubermann en gmail.com
Description: resize image, create thumb in square or proportional, grayscale or color mode
"""
def thumb_create(image, thumb_size,format,path,color):
image = Image.open(image)
if image.format.upper() == 'JPEG':
ext = 'jpg'
if image.format.upper() == 'PNG':
ext = 'png'
if image.format.upper() == 'GIF':
ext = 'gif'
final_name = "miimagen_thumb."+str(thumb_size)+"."+ext
#si requiere qeu sea B&N o color - parametro color en : true/false
if color==False:
if image.mode != "L":
image = image.convert('L')
#si es cuadrado
if format == 'square':
xsize, ysize = image.size
minsize = min(xsize,ysize)
xnewsize = (xsize-minsize)/2
ynewsize = (ysize-minsize)/2
area = image.crop((xnewsize, ynewsize, xsize-xnewsize, ysize-ynewsize))
resolution =thumb_size, thumb_size
finalthumb = area.resize(resolution , Image.ANTIALIAS)
final_name = path+final_name
finalthumb.save(final_name,quality = 100)
#si es proporcional
if format == 'normal':
new_width = thumb_size
new_height = new_width * image. size[1] / image. size[0]
resolution =new_width, new_height
finalthumb = image.resize(resolution , Image.ANTIALIAS)
final_name = path+final_name
finalthumb.save(final_name,quality = 100)
#imagen q tengo en la misma carpeta del script
imagen ="card.png"
#hice una carpeta llamada imagenes donde estoy guardando los thumb generados
path = "imagenes/"
# llamo a la funcion y le paso [archivo] [medidas] [cuadrado o proporcional] [carpeta a guardar] [True o False para color o B&N]
thumb_create(imagen, 200, 'square', path, color=True)
#######
On Sep 2, 2011, at 1:23 PM, Guillermo Moguel wrote:
> Hola Hubermann, efectivamente, para poder saber donde se encuentra tu
> imagen necesitaras consultarlo de tu modelo, en mi caso realizo una
> operación como la que tu requieres, el cambio es que yo no modifico la
> imagen original y únicamente modifico la imagen que me están
> consultando y regreso la nueva imagen. Esto me ha funcionado
> correctamente por que el flujo de la aplicación no en tan grande así
> que me va bien.
>
> Otro dato es que como la imagen no es accesible desde url (esto fue
> pensado así), las fotos en este caso son tratadas y regresadas para
> incrustar en un img de mi template.
> <img src="data:image/jpg;base64,{{ photo }}" alt="Base64 encoded image" />
>
>
> Y con poco de miedo de faltar a la culturilla pythónica.
>
> def foto64(fichero, mini=False):
> try :
> import base64
> archivo = StringIO()
> imagen = Image.open(fichero, "r") #el fichero seria la ruta de
> tu consulta del modelo
> x,y = imagen.size
> rel = round(Decimal(x)/Decimal(y), 2)
>
> if rel >= 1.33:
> recorte = [((x/2)-(y*5/12)),0,((x/2)+(y*5/12)),y]
> imagen = imagen.crop(recorte)
>
> if mini: #Esto lo uso para aun auto completado en un texbox, que
> regresa la foto con nombres
> imagen.thumbnail((30, 34), Image.ANTIALIAS)
> else:
> imagen.thumbnail((294, 391), Image.ANTIALIAS)
>
> imagen.save(archivo, 'JPEG')
> return base64.b64encode(archivo.getvalue())
>
> except:
> imagen = "" #aqui tendrias una cadena de alguna imagen que quieras
> regresar si tienes un error
> return imagen
>
> Saludos
>
> El día 1 de septiembre de 2011 12:04, Hubermann <hubermann en gmail.com> escribió:
>> Hola guillermo, gracias por la respuesta, ahora el tema es que soy sumamente novato en esto de django
>> (programo en php)
>>
>> como deberia hacer para saber cual es la imagen subida y darle las opciones de crop para el thumbnail, resize y luego eliminar la original? eso tengo q hacerlo en el modelo?
>>
>> puedo hacer una funcion aparte y pasarle los parametros que quiero?
>>
>> por ejemplo:
>>
>> from mi_funcion_para_imagenes import crop_imagen, resize_imagen
>>
>>
>> ultima = mi-imagen-recien-subida
>> ultima.crop_imagen(150px, cuadrado) //opciones de cuadrado o normal para cortar proporcionalmente
>> ultima.resize_imagen(700px) //llevar la imagen a un ancho maximo de 700px y luego eliminar la original
>>
>>
>> Gracias por responder, saludos desde Baires
>>
>>
>>
>> On Sep 1, 2011, at 12:06 AM, Guillermo Moguel wrote:
>>
>>> Puedes usar la librería de PIL con eso haces eso, yo la uso también
>>> con django y tengo esto para recortar la parte central mas o menos en
>>> una proporción de foto infantil
>>>
>>> from PIL import Image
>>>
>>> foto = Image.open(fichero)
>>> x = foto.size[0]
>>> y = foto.size[1]
>>> rel = round(Decimal(x)/Decimal(y), 2)
>>>
>>> if rel >= 1.33:
>>> recorte = [((x/2)-(y*5/12)),0,((x/2)+(y*5/12)),y
>>> foto = foto.crop(recorte)
>>>
>>> return foto
>>>
>>>
>>>
>>> Espero te sirva.
>>> Saludos de Chiapas.
>>>
>>> El día 31 de agosto de 2011 21:21, Hubermann <hubermann en gmail.com> escribió:
>>>> Hola
>>>>
>>>> quisiera saber que se usa en python para la tarea hacer crop y generar un thumbnail en Django.
>>>>
>>>> encontre un plugin thumbs.py pero solo hace thumbnail y lo hace cuadrado. (quisiera darle un ancho y el alto q sea proporcional)
>>>>
>>>> tambien encontre photologue pero me parece demasido grande para lo que necesito hacer y poca info de como utilizarlo
>>>>
>>>> Salu2
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> http://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>
>>>
>>>
>>> --
>>> Guillermo Moguel Mandujano
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> http://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>
>
>
> --
> Guillermo Moguel Mandujano
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
Más información sobre la lista de distribución Python-es