【问题标题】:set imageio compression level in python在python中设置imageio压缩级别
【发布时间】:2021-07-13 17:26:02
【问题描述】:

我在 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 来代替?

【问题讨论】:

  • 当您尝试阅读文档时发生了什么?例如,当您尝试输入 imageio gif quality into a search engine 时发生了什么?为什么您首先希望从 jpg 创建高质量的 gif 图像成为可能——您看到这样做了吗? (您熟悉 gif 格式吗?)为什么不使用实际的视频格式?您实际上要解决什么问题 - 为什么需要动画 gif?
  • 谷歌搜索,我主要是在 Java 中找到 imageio 的结果,其中似乎没有简单的方法来调整压缩。我正在制作一个 gif,因为有人要求我制作一个,但我不明白为什么 avi 或 mp4 也不够用。我对这些格式都不太了解。
  • 我会为此使用其他模块或外部工具 - 即。模块ffmpeg-python或直接编程ffmpeg,模块wand或直接编程imagemagick
  • 挖掘源代码我发现我可以访问一些GIFWriter 设置:writer._writer.opt_quantizerwriter._writer.opt_palette_size 但我认为主要问题是gif 只能显示256 colors 所以它有使用不同颜色的几个点来模拟一些颜色。其他问题可能会导致 JPG 文件降低图像质量。

标签: python animated-gif python-imageio


【解决方案1】:

真正的问题是GIF 只能显示256 colors(8 位颜色),因此它必须将24-bits 颜色(RGB)减少到256 colors,或者它使用不同颜色的点来模拟更多颜色 - ditherring.


关于选项:

挖掘源码发现可以得到两个参数quantizerpalettesize,可以控制图像/动画质量。 (还有subrectangles可以减小文件大小)

但是GIF 有两个插件使用不同的模块PillowFreeImage,它们需要不同的quantizer

PIL 需要整数 012

FI 需要字符串 'wu''nq'(但后来它会将其转换为整数 01

它们还以不同的方式保留这些值,因此如果您想获取当前值或在get_writer() 之后更改它,那么您还需要不同的代码。

您可以使用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)

我尝试创建具有不同设置的动画,但它们看起来并没有好多少。

我在控制台/终端中使用外部程序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 的包装器


源代码:GifWriter in pillowmulti.pyfreeimagemulti.py

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

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多