PDA

Visualizza la versione completa : [Python] Ridimensionare immagini


fermat
29-12-2016, 15:32
ciao!

vorrei ridimensionare le immagini usando python 3.
ho fatto qualche ricerca sul web, ma sinceramente non ho capito quale libreria dovrei usare.
perch ad esempio parlano di PIL/Pillow.
ma se faccio una ricerca tramite pip, ottengo una pletora di risultati:

Pillow-PIL (0.1dev)
PIL
pil-or-pillow
pilwrapper


oppure parlano di Image, ma anche qua non si capisce se fa parte di uno dei moduli sopra, o una classe a parte (e in caso come installarla).
e i tutorial non indicano cosa installare di preciso.

qualcuno sa darmi qualche delucidazione??

fermat
29-12-2016, 16:17
ok, ne sono venuto a capo:


$ sudo pip install pillow

questo un esempio di codice funzionante:


from PIL import Image

im = Image.open("/home/matte/Desktop/IMG.png")
imr = im.resize((100, 100))
imr.save("/home/matte/Desktop/IMG_R", "png")
ora sto cercando il modo di ridimensionare in maniera proporzionale.
nel senso che data, una determinata larghezza, ridimensiona l'altezza in maniera proporzionale.
sapete se possibile con questa libreria?

fermat
29-12-2016, 16:46
allora, questo codice funziona:


from PIL import Image, ImageOps

try:
size = (1900, 800)
im = Image.open("/home/matte/Desktop/IMG.png")
im.thumbnail(size, Image.ANTIALIAS)
im.save("/home/matte/Desktop/IMG_R.png", "PNG")
except:
print("Impossibile modificare l'immagine!")

la funzione thumbnail ridimensiona tenendo l'aspect ratio.
ha solo un problema rispetto alle mie esigenze: funziona al "contrario"!
nel senso che la funzione ridimensiona partendo dal valore pi piccolo dei due.

solo che io, ad esempio, gli passo solo l'altezza (800) e non gli passo la larghezza.
al momento dovrei passarli una larghezza fittizia per fargli capire di prendere in considerazione l'altezza (801).

fermat
29-12-2016, 17:39
uhm, c' qualcosa che mi sfugge:


import glob, os
from PIL import Image

class ResizeImage:
def resize(self, dir, w, h):
if w > h:
h = w + 1
elif h > w:
w = h + 1
size = (w, h)
print(size)
for infile in glob.glob(dir + "*.jpg"):
try:
print(infile)
file, ext = os.path.splitext(infile)
im = Image.open(infile)
im.thumbnail(size, Image.ANTIALIAS)
im.save(file + "_R.jpg", "JPEG")
except IOError:
print("Impossibile modificare l'immagine '%s' " % infile)

in entrambi i casi ridimensiona partendo dall'altezza.
mentre io vorrei in qualche maniera decidere per cosa ridimensionare.
qualcuno ha qualche consiglio?

fermat
30-12-2016, 10:35
ok penso di aver capito come funziona.
in automatico controlla se W > H o H > W.
in base a questo, ridimensiona partendo dal pi grande.

quindi se W > H, ridimensiona partendo dalla larghezza, e proporziona l'altezza.
se H > W fa l'operazione opposta.

ho fatto diverse prove, e il comportamento risultato sempre quello.

Loading