[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