在 python 中设置 imageio 压缩级别
set imageio compression level in python
我在 Python 中使用 imageio 读取 jpg 图像并将它们写成 gif,使用类似于下面的代码。
import imageio
with imageio.get_writer('mygif.gif', mode='I') as writer:
for filename in framefiles: # iterate over names of jpg files I want to turn into gif frames
frame = imageio.imread(filename)
writer.append_data(frame)
我注意到我制作的 gif 图像质量很差;我怀疑这是由于某种形式的压缩。有没有办法告诉 imageio 不要使用任何压缩?或者也许可以用 opencv 代替?
真正的问题是GIF
只能显示256 colors
(8位颜色)所以它必须减少24-bits
颜色(RGB)到256 colors
或者它使用不同颜色的点模拟更多颜色 - ditherring.
至于选项:
在源代码中挖掘我发现它可以获得两个参数quantizer
,palettesize
可以控制image/animation质量。 (还有subrectangles
减少文件大小)
但是 GIF
有两个插件使用不同的模块 Pillow
或 FreeImage
,它们需要不同的 quantizer
值
PIL
需要整数 0
、1
或 2
.
FI
需要字符串 'wu'
或 'nq'
(但稍后它将其转换为整数 0
或 1
)
它们还以不同的方式保存这些值,因此如果您想获取当前值或在 get_writer()
之后更改它,那么您还需要不同的代码。
您可以 select 模块与 format='GIF-PIL'
或 format='GIF-FI'
with imageio.get_writer('mygif.gif', format='GIF-PIL', mode='I',
quantizer=2, palettesize=32) as writer:
print(writer)
#print(dir(writer))
#print(writer._writer)
#print(dir(writer._writer))
print('quantizer:', writer._writer.opt_quantizer)
print('palette_size:', writer._writer.opt_palette_size)
#writer._writer.opt_quantizer = 1
#writer._writer.opt_palette_size = 256
#print('quantizer:', writer._writer.opt_quantizer)
#print('palette_size:', writer._writer.opt_palette_size)
with imageio.get_writer('mygif.gif', format='GIF-FI', mode='I',
quantizer='nq', palettesize=32) as writer:
print(writer)
#print(dir(writer))
print('quantizer:', writer._quantizer)
print('palette_size:', writer._palettesize)
#writer._quantizer = 1
#writer._palettesize = 256
#print('quantizer:', writer._quantizer)
#print('palette_size:', writer._palettesize)
我尝试用不同的设置创建动画,但它们看起来并没有好多少。
我在 console/terminal
中使用外部程序 ImageMagick 获得了更好的结果
convert image*.jpg mygif.gif
但它仍然不如视频或静态图像。
您可以 运行 在 Python
os.system("convert image*.jpg mygif.gif")
subprocess.run("convert image*.jpg mygif.gif", shell=True)
或者您可以尝试使用 Wand 模块来实现它,它是 ImageMagick
上的包装器
源代码:pillowmulti.py and in freeimagemulti.py
中的GifWriter
* wu - Wu, Xiaolin, Efficient Statistical Computations for Optimal Color Quantization
* nq (neuqant) - Dekker A. H., Kohonen neural networks for optimal color quantization
文档:GIF-PIL Static and animated gif (Pillow), GIF-FI Static and animated gif (FreeImage)
我在 Python 中使用 imageio 读取 jpg 图像并将它们写成 gif,使用类似于下面的代码。
import imageio
with imageio.get_writer('mygif.gif', mode='I') as writer:
for filename in framefiles: # iterate over names of jpg files I want to turn into gif frames
frame = imageio.imread(filename)
writer.append_data(frame)
我注意到我制作的 gif 图像质量很差;我怀疑这是由于某种形式的压缩。有没有办法告诉 imageio 不要使用任何压缩?或者也许可以用 opencv 代替?
真正的问题是GIF
只能显示256 colors
(8位颜色)所以它必须减少24-bits
颜色(RGB)到256 colors
或者它使用不同颜色的点模拟更多颜色 - ditherring.
至于选项:
在源代码中挖掘我发现它可以获得两个参数quantizer
,palettesize
可以控制image/animation质量。 (还有subrectangles
减少文件大小)
但是 GIF
有两个插件使用不同的模块 Pillow
或 FreeImage
,它们需要不同的 quantizer
PIL
需要整数 0
、1
或 2
.
FI
需要字符串 'wu'
或 'nq'
(但稍后它将其转换为整数 0
或 1
)
它们还以不同的方式保存这些值,因此如果您想获取当前值或在 get_writer()
之后更改它,那么您还需要不同的代码。
您可以 select 模块与 format='GIF-PIL'
或 format='GIF-FI'
with imageio.get_writer('mygif.gif', format='GIF-PIL', mode='I',
quantizer=2, palettesize=32) as writer:
print(writer)
#print(dir(writer))
#print(writer._writer)
#print(dir(writer._writer))
print('quantizer:', writer._writer.opt_quantizer)
print('palette_size:', writer._writer.opt_palette_size)
#writer._writer.opt_quantizer = 1
#writer._writer.opt_palette_size = 256
#print('quantizer:', writer._writer.opt_quantizer)
#print('palette_size:', writer._writer.opt_palette_size)
with imageio.get_writer('mygif.gif', format='GIF-FI', mode='I',
quantizer='nq', palettesize=32) as writer:
print(writer)
#print(dir(writer))
print('quantizer:', writer._quantizer)
print('palette_size:', writer._palettesize)
#writer._quantizer = 1
#writer._palettesize = 256
#print('quantizer:', writer._quantizer)
#print('palette_size:', writer._palettesize)
我尝试用不同的设置创建动画,但它们看起来并没有好多少。
我在 console/terminal
中使用外部程序 ImageMagick 获得了更好的结果convert image*.jpg mygif.gif
但它仍然不如视频或静态图像。
您可以 运行 在 Python
os.system("convert image*.jpg mygif.gif")
subprocess.run("convert image*.jpg mygif.gif", shell=True)
或者您可以尝试使用 Wand 模块来实现它,它是 ImageMagick
源代码:pillowmulti.py and in freeimagemulti.py
中的GifWriter
* wu - Wu, Xiaolin, Efficient Statistical Computations for Optimal Color Quantization
* nq (neuqant) - Dekker A. H., Kohonen neural networks for optimal color quantization
文档:GIF-PIL Static and animated gif (Pillow), GIF-FI Static and animated gif (FreeImage)