![](/img/trans.png)
[英]How to create/split multiple frame TIFF image using Python PIL or Pillow?
[英]How to create a multiple frame .tif image using Python PIL
我将如何使用python PIL创建一个具有多个框架的新图像。
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。 该代码通过将我拥有的总行数除以每帧的行数来获得帧数。 然后,它将数据用作像素数据。 我试图寻找一个新的框架,但我想它还没有被创造出来。 如何创建这些框架?
编辑:我想要一个.tif文件格式
new_Image
是您已加载的内容,即读取的内容 -如果它的帧数不超过一个,则无法继续移动下一帧。
目前,PIL不支持创建多帧GIF,因此您需要切换到枕形-GitHub上有一些示例代码。
花了一些时间进行进一步的调查,发现了images2gif
的错误修复版本,所以我要做的是使用pip install images2gif
,然后从此处下载了错误修复版本,并覆盖了pip
安装的版本,但是您可以下载该错误修复版本并将其放在开发文件所在的目录中。
然后,我创建了一个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")
在我的测试目录中运行它导致:
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 ,然后:
# 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文件,如下所示。
从第一帧的PIL图像开始,然后保存该图像,并将列表中的其他帧图像传递到append_images
参数并将其全部保存。 它适用于webp
, gif
和tiff
格式,尽管tiff
似乎忽略了持续时间和循环参数:
im1.save(save_to, format="tiff", append_images=[im2], save_all=True, duration=500, loop=0)
另请参阅文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.