2012-02-03 18 views
6

Mi chiedo se sia possibile ridimensionare un'immagine GIF animata utilizzando PIL. In particolare gli archetipi di Plone ImageField attualmente perde l'animazione dalle immagini in scala utilizzando il suo metodo di scala:Come ridimensionare un'immagine GIF animata in PIL e conservare l'animazione

def scale(self, data, w, h, default_format = 'PNG'): 
    """ scale image (with material from ImageTag_Hotfix)""" 
    #make sure we have valid int's 
    size = int(w), int(h) 

    original_file=StringIO(data) 
    image = PIL.Image.open(original_file) 
    # consider image mode when scaling 
    # source images can be mode '1','L,','P','RGB(A)' 
    # convert to greyscale or RGBA before scaling 
    # preserve palletted mode (but not pallette) 
    # for palletted-only image formats, e.g. GIF 
    # PNG compression is OK for RGBA thumbnails 
    original_mode = image.mode 
    img_format = image.format and image.format or default_format 
    if original_mode == '1': 
     image = image.convert('L') 
    elif original_mode == 'P': 
     image = image.convert('RGBA') 
    image.thumbnail(size, self.pil_resize_algo) 
    # decided to only preserve palletted mode 
    # for GIF, could also use image.format in ('GIF','PNG') 
    if original_mode == 'P' and img_format == 'GIF': 
     image = image.convert('P') 
    thumbnail_file = StringIO() 
    # quality parameter doesn't affect lossless formats 
    image.save(thumbnail_file, img_format, quality=self.pil_quality) 
    thumbnail_file.seek(0) 
    return thumbnail_file, img_format.lower() 

so come identificare un GIF animata: Le seguenti restituisce True image.format == 'GIF' and image.seek(image.tell()+1). Ho provato a non convertire in modalità RGBA ma non funziona.

Sfondo: Sulla nostra istanza Plone abbiamo modificato il tipo di immagine predefinito per impostare l'attributo original_size del suo campo immagine per forzare tutte le immagini a ridimensionare con un'impostazione di qualità appropriata. Funziona perfettamente per i file JPEG ma significa che al momento non possiamo caricare GIF animate

+0

È probabile che il ridimensionamento di un'immagine a tavolo abbia come risultato una qualità dell'immagine inaccettabile. –

risposta

4

PIL ha un supporto limitato per le GIF animate ma è, come detto, limitato, e devi lavorare in un livello molto basso per affrontarlo .

Si consiglia di provare qualche altro metodo per ridimensionare le immagini rispetto a PIL se si desidera gestire le gif animate. Forse, il modo più semplice è usare un ImageMagick fuori processo, con sottoprocesso.Popen - (e anche allora, in questo momento, immagino solo che ImageMagick "faccia la cosa giusta" con le GIF animate) -

l'opzione è di avere un "server di elaborazione immagini", con un altro script Python, oltre alla tua installazione di zope che riceverà richieste per ridimensionare le immagini - possibilmente con una chiamata xmlrpc - potresti creare questo come plug-in GIMP e usare GIMP per ridimensionamento delle GIF.

Un'altra opzione è lasciare le cose come sono e utilizzare "immagini fisse" per le GIF animate in cui devono apparire in un'altra dimensione rispetto all'originale e visualizzare l'immagine originale in cui l'animazione è appropriata. (O forse semplicemente richiede che le gif animate vengano inviate già della giusta dimensione)

+2

Grazie. Ho ottimizzato il codice in modo che non tenti di ridimensionare le immagini GIF animate se l'immagine sorgente non è più grande della scala. Vedi http://dev.plone.org/ticket/12488 – scarba05

+1

Ho dato un ulteriore sguardo a PIL - ha infatti un supporto per la lettura di gifś multi-frame, ma nessun supporto per la creazione o la scrittura. – jsbueno

7

Puoi usare images2gif.py per leggere gif e scalare ogni fotogramma in modo indipendente. images2gif ti permetterà di scrivere una gif animata con una sequenza di immagini.

Il file images2gif.py che ho trovato su Internet non gestiva la trasparenza, quindi l'ho risolto. Si possono trovare che qui: https://bitbucket.org/bench/images2gif.py

Problemi correlati