2012-07-26 23 views
7

sto prendendo un file di immagine e di miniature e il ritaglio con il seguente codice PIL:Colore riempimento del PIL ritaglio/miniature

 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') 

Questa grande opera, salvo quando l'immagine non è lo stesso rapporto di aspetto, la differenza è riempita con un colore nero (o forse un canale alfa?). Sto bene con il riempimento, mi piacerebbe solo essere in grado di selezionare il colore di riempimento - o meglio ancora un canale alfa. esempio

uscita:

output

Come posso specificare il colore di riempimento?

risposta

13

Ho modificato leggermente il codice per consentire di specificare il proprio colore di sfondo, inclusa la trasparenza. Il codice carica l'immagine specificata in un oggetto PIL.Image, genera la miniatura dalla dimensione specificata e quindi incolla l'immagine in un'altra superficie di dimensioni complete. (Si noti che la tupla utilizzata per il colore può anche essere qualsiasi valore RGBA, ho appena usato bianca con un alfa/trasparenza delle 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

funziona alla grande. Sembra così semplice a posteriori - grazie! – Erik

11

suo un po 'più facile da paste il rinnovo -misura un'immagine in miniatura su una nuova immagine, ovvero il colore (e il valore alfa) che si desidera.

È possibile creare un'immagine e speicfy il suo colore in un RGBA tupla come questo:

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

Qui non c'è non c'è trasparenza come banda alfa è impostato su 255. Ma lo sfondo sarà rosso . Utilizzando questa immagine per incollare sul possiamo creare le miniature con qualsiasi colore in questo modo:

enter image description here

Se impostiamo la banda alfa per 0, siamo in grado di paste su un'immagine trasparente, e ottenere questo:

enter image description here

codice Esempio:

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') 
Problemi correlati