Cómo crear una imagen .tif de múltiples marcos utilizando Python PIL

¿Cómo haría para crear una nueva imagen, usando Python PIL, que tiene múltiples marcos?

new_Image = Image.new("I;16", (num_pixels,num_rows)) for frame in range((len(final_rows)/num_rows)): pixels = new_Image.load() for row in range(num_rows): row_pixel = final_rows[row].getPixels() for pixel in range(num_pixels): pixels[pixel,row] = row_pixel[pixel] print frame new_Image.seek(frame) 

Intenté usar el código anterior pero me da un EOFError. El código obtiene el número de cuadros al dividir el número total de filas que tengo por el número de filas por cuadro. A continuación, utiliza los datos como datos de píxeles. Estaba tratando de buscar un nuevo marco, pero creo que no se ha creado. ¿Cómo creo estos marcos?

Edición: Me gustaría un formato de archivo .tif

new_Image es lo que has cargado, es decir, lee : si no tiene más de un cuadro, no puedes moverte al siguiente.

Por el momento, PIL no tiene soporte para crear GIF de múltiples cuadros, por lo que necesitarías cambiar a una almohada, pero sí hay un código de ejemplo en GitHub .

Actualizar

Tomé el tiempo para investigar más y encontré una versión corregida de images2gif de images2gif así que lo que hice fue usar pip install images2gif y luego descargué la versión de bugs corregida desde aquí y sobrescribí la que instaló pip pero solo podía descargar esa versión de corrección de bugs. ponlo en el mismo directorio que tu archivo de desarrollo.

Entonces creé un archivo CreateGif.py:

 # coding: utf-8 from __future__ import print_function # Python 2/3 compatibility import glob from PIL import Image from images2gif import writeGif DELAY=0.75 # How long between frames FRAMES = [] # Empty list of frames FIRST_SIZE = None # I am going to say that the first file is the right size OUT_NAME = "test.gif" # Name to save to filelist = glob.glob("*.jpg") # For this test I am just using the images in the current directory in the order they are for fn in filelist: # For each name in the list img = Image.open(fn) # Read the image if FIRST_SIZE is None: # Don't have a size FIRST_SIZE = img.size # So use this one if img.size == FIRST_SIZE: # Check the current image size if it is OK we can use it print ("Adding:", fn) # Show some progress FRAMES.append(img) # Add it to our frames list else: print ("Discard:", fn, img.size, "<>", FIRST_SIZE) # You could resize and append here! print("Writing", len(FRAMES), "frames to", OUT_NAME) writeGif(OUT_NAME, FRAMES, duration=DELAY, dither=0) print("Done") 

Ejecutar esto en mi directorio de prueba resultó en:

 F:\Uploads>python CreateGif.py Adding: Hidden.jpg Adding: NewJar.jpg Adding: P1000063.JPG Adding: P1000065.JPG Adding: P1000089.JPG Discard: WiFi_Virgin.jpg (370, 370) <> (800, 600) Writing 5 frames to test.gif Done 

Y producido: introduzca la descripción de la imagen aquí

Y ahora para archivos TiFF

Primero instalé tiffile, pip install -U tiffile , ya tenía el número instalado , luego:

 # coding: utf-8 from __future__ import print_function # Python 2/3 compatibility import glob from PIL import Image import tifffile import numpy def PIL2array(img): """ Convert a PIL/Pillow image to a numpy array """ return numpy.array(img.getdata(), numpy.uint8).reshape(img.size[1], img.size[0], 3) FRAMES = [] # Empty list of frames FIRST_SIZE = None # I am going to say that the first file is the right size OUT_NAME = "test.tiff" # Name to save to filelist = glob.glob("*.jpg") # For this test I am just using the images in the current directory in the order they are # Get the images into an array for fn in filelist: # For each name in the list img = Image.open(fn) # Read the image if FIRST_SIZE is None: # Don't have a size FIRST_SIZE = img.size # So use this one if img.size == FIRST_SIZE: # Check the current image size if it is OK we can use it print ("Adding:", fn) # Show some progress FRAMES.append(img) # Add it to our frames list else: print ("Discard:", fn, img.size, "<>", FIRST_SIZE) # You could resize and append here! print("Writing", len(FRAMES), "frames to", OUT_NAME) with tifffile.TiffWriter(OUT_NAME) as tiff: for img in FRAMES: tiff.save(PIL2array(img), compress=6) print("Done") 

Lo que produjo un buen archivo tiff, pero desafortunadamente el visor SO no muestra archivos tiff de varias páginas que al menos Windows considera aceptables, como se puede ver a continuación. introduzca la descripción de la imagen aquí

Comience con una imagen PIL del primer fotogtwig, luego append_images y pase las otras imágenes de fotogtwig en una lista al parámetro append_images y append_images todas. Funciona con los webp , gif y tiff , aunque tiff parece ignorar los parámetros de duración y bucle:

 im1.save(save_to, format="tiff", append_images=[im2], save_all=True, duration=500, loop=0) 

Véase también la documentación .