How to create a multiple frame .tif image using Python PIL

前端 未结 2 836
执念已碎
执念已碎 2020-12-11 21:00

How would I go about creating a new image, using python PIL, which has multiple frames in it.

new_Image = Image.new(\"I;16\", (num_pixels,num_rows))

for f         


        
相关标签:
2条回答
  • 2020-12-11 21:14

    new_Image is what you have loaded, i.e. read - if it doesn't have more than one frame you can not move on the the next.

    For the moment PIL does not have support for creating Multi-Frame GIFs so you would need to switch to pillow which does - there is some sample code on GitHub.

    Update

    Took the time to investigate further and found a bug fixed version of images2gif so what I did was to use pip install images2gif and then downloaded the bug fixed version from here and overwrote the one installed by pip but you could just download that bug fix version and put it in the same directory as your development file.

    I then created a CreateGif.py file:

    # 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")
    

    Running this in my test directory resulted in:

    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
    

    And produced:

    And Now For TiFF files

    First I installed tiffile, pip install -U tiffile, I already had numpy installed, then:

    # 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")
    

    Which produced a nice tiff file, but unfortunately the SO viewer does not display multi-page tiff files that windows at least thinks is acceptable as can be seen below.

    0 讨论(0)
  • 2020-12-11 21:30

    Start with a PIL image of the first frame, then save that and pass the other frame images in a list to the append_images parameter and save them all. It works with webp, gif, and tiff formats, though tiff appears to ignore the duration and loop parameters:

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

    See also the documentation.

    0 讨论(0)
提交回复
热议问题