1.使用images2gif.writeGif 过程中出现两个错误
typeError:must be string or buffer, not None only integer scalar arrays can be converted to a scalar index可能是各个packages的版本不对,经过各种尝试没有真正解决这两个错误。接着在网上找到合成gif的源码 发现还是出现该错误 typeError:must be string or buffer, not None 2.一开始我参照image2gif.py的解决方案,把_writeGifToFile中的
for im in images: if not previous: # 第一个图像 # 获取相关数据 palette = getheader(im)[1] #取第一个图像的调色板替换为
for im in images: if not previous: # 第一个图像 # 获取相关数据 palette = im.palette.getdata()[1] #取第一个图像的调色板之后生成的gif是灰色的。 3.我想这个肯定和调色板数据的读取有关。于是我找到imges2gif的源码的作者对这类似代码片段的最新修改,把它迁移到这边的源码,就work了。修改如下
for im in images: if not previous: # 第一个图像 # 获取相关数据 palette=getheader(im)[0][-1]全部代码如下:(修改address 和输入输出名字即可使用)
#coding=utf-8 import time import string from PIL import Image, ImageChops from PIL.GifImagePlugin import getheader, getdata import os def intToBin(i): """ 把整型数转换为双字节 """ # 先分成两部分,高8位和低8位 i1 = i % 256 i2 = int( i/256) # 合成小端对齐的字符串 return chr(i1) + chr(i2) def getheaderAnim(im): """ 生成动画文件头 """ bb = "GIF89a" bb += intToBin(im.size[0]) bb += intToBin(im.size[1]) bb += "\x87\x00\x00" #使用全局颜色表 return bb def getAppExt(loops=0): """ 应用扩展,默认为0,为0是表示动画是永不停止 """ bb = "\x21\xFF\x0B" # application extension bb += "NETSCAPE2.0" bb += "\x03\x01" if loops == 0: loops = 2**16-1 bb += intToBin(loops) bb += '\x00' # end return bb def getGraphicsControlExt(duration=0.1): """ 设置动画时间间隔 """ bb = '\x21\xF9\x04' bb += '\x08' # no transparancy bb += intToBin( int(duration*100) ) # in 100th of seconds bb += '\x00' # no transparant color bb += '\x00' # end return bb def _writeGifToFile(fp, images, durations, loops): """ 把一系列图像转换为字节并存入文件流中 """ # 初始化 frames = 0 previous = None for im in images: if not previous: # 第一个图像 # 获取相关数据 palette=getheader(im)[0][-1] #palette =im.palette.getdata()[1] #取第一个图像的调色板 #print(type(palette)) data = getdata(im) imdes, data = data[0], data[1:] header = getheaderAnim(im) appext = getAppExt(loops) graphext = getGraphicsControlExt(durations[0]) # 写入全局头 fp.write(header) fp.write(palette) fp.write(appext) # 写入图像 fp.write(graphext) fp.write(imdes) for d in data: fp.write(d) else: # 获取相关数据 data = getdata(im) imdes, data = data[0], data[1:] graphext = getGraphicsControlExt(durations[frames]) # 写入图像 fp.write(graphext) fp.write(imdes) for d in data: fp.write(d) # 准备下一个回合 previous = im.copy() frames = frames + 1 fp.write(";") # 写入完成 return frames def writeGif(filename, images, duration=0.1, loops=0, dither=1): """ writeGif(filename, images, duration=0.1, loops=0, dither=1) 从输入的图像序列中创建GIF动画 images 是一个PIL Image [] 或者 Numpy Array """ images2 = [] # 先把图像转换为PIL格式 for im in images: if isinstance(im,Image.Image): #如果是PIL Image images2.append( im.convert('P',dither=dither) ) elif np and isinstance(im, np.ndarray): #如果是Numpy格式 if im.dtype == np.uint8: pass elif im.dtype in [np.float32, np.float64]: im = (im*255).astype(np.uint8) else: im = im.astype(np.uint8) # 转换 if len(im.shape)==3 and im.shape[2]==3: im = Image.fromarray(im,'RGB').convert('P',dither=dither) elif len(im.shape)==2: im = Image.fromarray(im,'L').convert('P',dither=dither) else: raise ValueError("图像格式不正确") images2.append(im) else: raise ValueError("未知图像格式") # 检查动画播放时间 durations = [duration for im in images2] # 打开文件 fp = open(filename, 'wb') # 写入GIF try: n = _writeGifToFile(fp, images2, durations, loops) finally: fp.close() return n ############################################################ ## 将多帧位图合成为一幅gif图像 def images2gif( images, giffile, durations=0.05, loops = 0): seq = [] for i in range(len(images)): im = Image.open(images[i]) background = Image.new('RGB', im.size, (255,255,255)) background.paste(im, (0,0)) seq.append(background) frames = writeGif( giffile, seq, durations, loops) print frames, 'images has been merged to', giffile ############################################################## #frames = gif2images('source.gif',distDir='tmp',type='png') address='/home/lab-huang.junhong/DeepLearning/\ WGAN_experiment/gif_test_1'#experiment_CelebA_WGAN_s64_n27_b64_w5/ li=os.listdir(address) li.sort() #name="1.jpg"#"fake_samples_1000.png" images = [] for name in li : if os.path.splitext(name)[1]==".png": images.append("{0}/{1}".format(address,name)) gif_name="face.gif" images2gif(images,"{0}/{1}".format(address,gif_name), durations = 0.5)