【问题标题】:Grabbing animated gif with python script使用 python 脚本抓取动画 gif
【发布时间】:2014-09-01 12:26:31
【问题描述】:

我一直在 iOS 上使用 Pythonista 来创建一些自动化脚本。

我在尝试从远程 url 获取动画 gif 时遇到问题。我想出了以下脚本。

import Image
from urllib import urlopen
from io import BytesIO

url = "http://someurl.com/funny.gif"
img = Image.open(BytesIO(urlopen(url).read()))

我得到了图像,但它似乎只是 gif 的第一帧?我猜这与 BytesIO 没有读取整个文件有关,但我不确定?

希望我的思路是正确的。

【问题讨论】:

  • 我宁愿说这与您打开和操作图像的方式有关。 urlopen 有什么关系,它下载什么样的 URI,你会以同样的方式获取 html 和二进制文件?尝试将其保存为文件,然后使用外部工具打开。
  • 它似乎没有以这种方式将其保存为 gif?也许我可以通过其他方式读取文件?
  • 您是否真的尝试过保存文件而不是图像?您没有显示任何代码。您只需打开 url 并从中创建一个 Image 对象。
  • 我删除了一条用于在 iOS 的 pythonista 中保存到剪贴板的行。当我粘贴图像时,它是 clipboard.set_image(url),它只是第一帧。也用一个 photos.save_image() 但如上所述,这些特定于 pythonista

标签: python


【解决方案1】:

你快到了。您使用img.seek 来推进帧。所以..

import Image
from urllib import urlopen
from io import BytesIO
url = 'http://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif'

img = Image.open(BytesIO(urlopen(url).read()))

# Start with first frame
img.seek(0)
#img.show()

# Advance by one
img.seek(img.tell() + 1)
#img.show()

Here's a SO post 展示了如何使用 Image 类保存 gif。

【讨论】:

  • 有没有办法获得另一个只有一帧的图像对象?我有另一个问题,我认为这是由 gif 编码的特定方式引起的,我认为如果我可以从 gif 对象中提取单个帧,它将修复它。 (gif 将其透明度替换为在 tkinter 画布上呈现的平面颜色,问题是这些颜色从 gif 变为 gif,所以我认为这与每个单独的 gif 的编码方式有关。)
【解决方案2】:

根据Pillow Manual

要保存所有帧,必须存在 save_all 参数并将其设置为 True。

因此,打开的图像可以通过以下方式保存:

image.save('filename.gif', save_all=True)

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多