Heim >Backend-Entwicklung >Python-Tutorial >Einführung in Pythons Analyse und Synthese dynamischer GIF-Grafiken

Einführung in Pythons Analyse und Synthese dynamischer GIF-Grafiken

不言
不言nach vorne
2018-12-31 09:24:274245Durchsuche

Der Inhalt dieses Artikels ist eine Einführung in die Analyse- und Syntheseoperationen der Verarbeitung dynamischer GIF-Bilder. Ich hoffe, dass er für Sie hilfreich ist.

Das Beispiel in diesem Artikel beschreibt die Analyse und Synthese dynamischer GIF-Grafiken in der Python-Bildverarbeitung. Ich möchte es als Referenz mit Ihnen teilen:

Gif-animierte Bilder sind mittlerweile an der Tagesordnung, und im Freundeskreis streiten sich die Leute oft darum, wenn sie anderer Meinung sind. Hier werde ich vorstellen, wie man Python zum Parsen und Generieren von GIF-Bildern verwendet.

1. Synthese der GIF-Animation

Wie unten gezeigt, handelt es sich um eine GIF-Animation.

Sie können das PIL Bildmodul verwenden, um das dynamische GIF-Bild zu analysieren. Der spezifische Code lautet wie folgt:

#-*- coding: UTF-8 -*-
import os
from PIL import Image
def analyseImage(path):
  '''
  Pre-process pass over the image to determine the mode (full or additive).
  Necessary as assessing single frames isn't reliable. Need to know the mode
  before processing all frames.
  '''
  im = Image.open(path)
  results = {
    'size': im.size,
    'mode': 'full',
  }
  try:
    while True:
      if im.tile:
        tile = im.tile[0]
        update_region = tile[1]
        update_region_dimensions = update_region[2:]
        if update_region_dimensions != im.size:
          results['mode'] = 'partial'
          break
      im.seek(im.tell() + 1)
  except EOFError:
    pass
  return results
def processImage(path):
  '''
  Iterate the GIF, extracting each frame.
  '''
  mode = analyseImage(path)['mode']
  im = Image.open(path)
  i = 0
  p = im.getpalette()
  last_frame = im.convert('RGBA')
  try:
    while True:
      print "saving %s (%s) frame %d, %s %s" % (path, mode, i, im.size, im.tile)
      '''
      If the GIF uses local colour tables, each frame will have its own palette.
      If not, we need to apply the global palette to the new frame.
      '''
      if not im.getpalette():
        im.putpalette(p)
      new_frame = Image.new('RGBA', im.size)
      '''
      Is this file a "partial"-mode GIF where frames update a region of a different size to the entire image?
      If so, we need to construct the new frame by pasting it on top of the preceding frames.
      '''
      if mode == 'partial':
        new_frame.paste(last_frame)
      new_frame.paste(im, (0,0), im.convert('RGBA'))
      new_frame.save('%s-%d.png' % (''.join(os.path.basename(path).split('.')[:-1]), i), 'PNG')
      i += 1
      last_frame = new_frame
      im.seek(im.tell() + 1)
  except EOFError:
    pass
def main():
  processImage('test_gif.gif')
if __name__ == "__main__":
  main()

Das Analyseergebnis ist wie folgt Dies zeigt, dass das Bild tatsächlich aus 14 statischen Bildern derselben Auflösung besteht

2. Synthese von dynamische GIF-Bilder

Gif-Bildsynthese unter Verwendung der imageio Bibliothek (https://pypi.python.org/pypi/imageio)

Der Code ist wie folgt folgt:

#-*- coding: UTF-8 -*-
import imageio
def create_gif(image_list, gif_name):
  frames = []
  for image_name in image_list:
    frames.append(imageio.imread(image_name))
  # Save them as frames into a gif
  imageio.mimsave(gif_name, frames, 'GIF', duration = 0.1)
  return
def main():
  image_list = ['test_gif-0.png', 'test_gif-2.png', 'test_gif-4.png',
         'test_gif-6.png', 'test_gif-8.png', 'test_gif-10.png']
  gif_name = 'created_gif.gif'
  create_gif(image_list, gif_name)
if __name__ == "__main__":
  main()

Verwenden Sie hier Die 8 Bilder in den im ersten Schritt analysierten Bildern haben ein Intervall von 0,1 s. Das neue dynamische GIF-Bild wird wie folgt synthetisiert:

Das obige ist der detaillierte Inhalt vonEinführung in Pythons Analyse und Synthese dynamischer GIF-Grafiken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen