如何使用Python PIL创建多帧.tif图像 [英] How to create a multiple frame .tif image using Python PIL

查看:225
本文介绍了如何使用Python PIL创建多帧.tif图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将如何使用python PIL创建新图像,该图像中包含多个框架.

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

我尝试使用上面的代码,但是它给了我一个EOFError.该代码通过将我拥有的总行数除以每帧的行数来获得帧数.然后,它将数据用作像素数据.我试图寻找一个新的框架,但我想它还没有被创造出来.如何创建这些框架?

I tried using the above code but it gives me a EOFError. The code gets the number of frames by dividing the total number of rows that I have by the number of rows per frame. It then uses the data as pixel data. I was trying to seek a new frame but I guess it hasn't been created. How do I create these frames?

我想要一个.tif文件格式

I would like a .tif file format

推荐答案

new_Image是您已加载的内容,即已读-如果该帧不超过一帧,则无法移动在下一个.

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.

目前PIL不支持创建多帧GIF,因此您需要切换到

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.

花时间进一步调查并找到images2gif的错误修复版本,因此所做的就是使用pip install images2gif,然后从

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.

然后我创建了一个CreateGif.py文件:

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

并生成:

首先我安装了tiffile,pip install -U tiffile我已经安装了numpy ,然后:

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

这产生了一个不错的tiff文件,但不幸的是,SO查看器无法显示Windows至少认为可以接受的多页tiff文件,如下所示.

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.

这篇关于如何使用Python PIL创建多帧.tif图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆