2012-07-26 16 views
7

estoy tomando un archivo de imagen y thumbnailing y recortarla con el siguiente código PIL:Color de relleno del PIL Recorte/Thumbnailing

 image = Image.open(filename) 
     image.thumbnail(size, Image.ANTIALIAS) 
     image_size = image.size 
     thumb = image.crop((0, 0, size[0], size[1])) 
     offset_x = max((size[0] - image_size[0])/2, 0) 
     offset_y = max((size[1] - image_size[1])/2, 0) 
     thumb = ImageChops.offset(thumb, offset_x, offset_y)     
     thumb.convert('RGBA').save(filename, 'JPEG') 

Esto funciona muy bien, excepto cuando la imagen no es la misma relación de aspecto, la diferencia se completa con un color negro (¿o tal vez un canal alfa?). Estoy de acuerdo con el llenado, me gustaría poder seleccionar el color de relleno, o mejor aún un canal alfa. ejemplo

Salida:

output

Cómo puede especificar que el color de relleno?

Respuesta

13

He alterado el código solo un poco para permitirle especificar su propio color de fondo, incluida la transparencia. El código carga la imagen especificada en un objeto PIL.Image, genera la miniatura del tamaño dado y luego pega la imagen en otra superficie de tamaño completo. (Tenga en cuenta que la tupla utilizado para el color también puede ser cualquier valor RGBA, simplemente he usado blanco con un alfa/transparencia de 0.)


# assuming 'import from PIL *' is preceding 
thumbnail = Image.open(filename) 
# generating the thumbnail from given size 
thumbnail.thumbnail(size, Image.ANTIALIAS) 

offset_x = max((size[0] - thumbnail.size[0])/2, 0) 
offset_y = max((size[1] - thumbnail.size[1])/2, 0) 
offset_tuple = (offset_x, offset_y) #pack x and y into a tuple 

# create the image object to be the final product 
final_thumb = Image.new(mode='RGBA',size=size,color=(255,255,255,0)) 
# paste the thumbnail into the full sized image 
final_thumb.paste(thumbnail, offset_tuple) 
# save (the PNG format will retain the alpha band unlike JPEG) 
final_thumb.save(filename,'PNG') 
+0

funciona muy bien. Parece muy simple en retrospectiva, ¡gracias! – Erik

11

Es un poco más fácil de paste su re tamaño reducido en una nueva imagen, que es el color (y el valor alfa) que desea.

Puede crear una imagen, y speicfy su color en una tupla RGBA así:

Image.new('RGBA', size, (255,0,0,255)) 

Aquí no hay ninguna transparencia como la banda alfa se establece en 255. Sin embargo, el fondo será de color rojo . El uso de esta imagen para pegar en que podemos crear miniaturas con cualquier color de la siguiente manera:

enter image description here

Si fijamos la banda alfa a 0, podemos paste sobre una imagen transparente, y conseguir esto:

enter image description here

código Ejemplo:

import Image 

image = Image.open('1_tree_small.jpg') 
size=(50,50) 
image.thumbnail(size, Image.ANTIALIAS) 
# new = Image.new('RGBA', size, (255, 0, 0, 255)) #without alpha, red 
new = Image.new('RGBA', size, (255, 255, 255, 0)) #with alpha 
new.paste(image,((size[0] - image.size[0])/2, (size[1] - image.size[1])/2)) 
new.save('saved4.png') 
Cuestiones relacionadas