Maison  >  Article  >  développement back-end  >  Introduction à l'analyse et à la synthèse Python des graphiques dynamiques GIF

Introduction à l'analyse et à la synthèse Python des graphiques dynamiques GIF

不言
不言avant
2018-12-31 09:24:274193parcourir

Le contenu de cet article est une introduction aux opérations d'analyse et de synthèse du traitement Python des images dynamiques gif. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

L'exemple de cet article décrit l'analyse et la synthèse de graphiques dynamiques gif dans le traitement d'image Python. J'aimerais le partager avec vous pour votre référence. Les détails sont les suivants :

Les images animées GIF sont désormais monnaie courante, et les gens se disputent souvent pour elles dans le cercle d'amis lorsqu'ils ne sont pas d'accord. Ici, je vais vous présenter comment utiliser Python pour analyser et générer des images GIF.

1. Synthèse de l'animation gif

Comme indiqué ci-dessous, il s'agit d'une animation gif.

L'analyse des images dynamiques gif peut utiliser le module image PIL Le code spécifique est le suivant :

#-*- 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()

Les résultats de l'analyse sont. comme suit, on peut donc voir que L'image dynamique modifiée est en fait une combinaison de 14 images statiques de même résolution

2. Synthèse de image dynamique gif

Synthèse d'image Gif, en utilisant la bibliothèque imageio (https://pypi.python.org/pypi/imageio)

Le code est le suivant suit :

#-*- 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()

Ici, en utilisant 8 images issues des images analysées dans la première étape, avec un intervalle de 0,1 s, la nouvelle animation gif est synthétisée comme suit :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer