如何将互联网上的图像保存到 Python 中的本地文件

Posted

技术标签:

【中文标题】如何将互联网上的图像保存到 Python 中的本地文件【英文标题】:How to save an image on the internet to local file in Python 【发布时间】:2017-07-26 09:19:33 【问题描述】:

我想从 reddit 和 imgur 获取直接图片链接,将它们保存到文件中,然后将它们上传到 twitter。我这样做没有真正的原因,我只是想要练习,因为我是编程新手。我不确定如何将图像链接保存到文件中。我遇到了一个 *** 问题,它问了同样的问题,而那个人给出的答案是使用 urllib.retrieve

这是我正在使用的代码:

def post_to_twitter():
    if 'i.redd.it/' in submission.url or 'i.imgur.com/' in submission.url:
        print(submission.url)
        urllib.urlretrieve(str(submission.url),'<my directory>')
    elif 'i.redd.it/' not in submission.url or 'i.imgur.com/' not in submission.url:
        print('No direct imgur or reddit image link')

但是,当我运行此代码时,我收到了一个以前从未遇到过的 unicode 错误 - (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape,然后 IDLE 突出显示了我在提交 URL 和我选择的目录之间使用的逗号。

显然这是错误的代码,我确信使用图像链接保存到文件并不像使用单行代码那么容易。我做错了什么,还是有更好的方法来做到这一点?如果可能的话,请你解释一下,就像我五岁一样。我是编程新手,还不懂一些让我感到困惑的词。


我找到了解决方案

我实际上设法使用我使用的原始代码来实现这个,但稍作调整。

我用过:

urllib.request.urlretrieve(submission.url, 'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg')

submission.url返回图片的链接,所以你可以用任何你想要的替换它,只要它等于直接的图片链接作为字符串,例如my_url = "http://i.imgur.com/qjMiF2A.gif"

'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg' 是您要保存的图像的名称。您还可以在其中指定路径。但是,因为我不能手动指定我希望文件保存为什么,所以我使用 submit.id 作为文件名,这样我可以保证它始终是唯一的。然后我只需在其末尾添加.jpeg 以指定文件类型。

【问题讨论】:

Imgur 无法正常工作,他们正在使用 react 除非它确实有效。我编辑了我的原始问题以包含解决方案,并自己发布了一个答案。 【参考方案1】:

试试这个:

import os
import urllib.request
import urllib.error
def saveImg(url,path,name):
    #url is imgurl 
    #path is your folder 
    #name is like tmp.png
    if not os.path.exists(path):
        os.mkdir(path)
    try:
        response=urllib.request.urlopen(url);
    except urllib.error.URLError as e:
        return 0
    except urllib.error.HTTPError as e:
        return 0
    code=response.read()
    filehandle=open(path+name,'wb');
    filehandle.write(code)
    filehandle.close()
    return 1

【讨论】:

没关系,我实际上设法用我原来帖子中的那一行代码来做到这一点,但我对其进行了一些修改以使其工作。如果您想看看我是如何做到的,我发布了解决方案作为答案。【参考方案2】:

你需要先点 PILRequests 最干净的方法是

from PIL import Image
import requests
from io import BytesIO
r=requests.get(name)
image=Image.open(BytesIO(r.content))
image.save('0.jpg'.format("Image"))

【讨论】:

当我尝试 pip install PIL 时,我收到了这条消息 - i.imgur.com/6LuFFlk.png 没关系,我实际上设法用我原来帖子中的那一行代码来做到这一点,但我对其进行了一些修改以使其工作。如果您想看看我是如何做到的,我发布了解决方案作为答案。【参考方案3】:

我实际上设法使用我使用的原始代码来实现这个,但稍作调整。

我用过:

urllib.request.urlretrieve(submission.url, 'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg')

submission.url 返回图像的链接,因此您可以将其替换为您想要的任何内容,只要它等于作为字符串的直接图像链接即可。

'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg' 是您要保存的图像的名称。您还可以在其中指定路径。但是,因为我不能手动指定我希望文件保存为什么,所以我使用 submit.id 作为文件名,这样我可以保证它始终是唯一的。然后我只需在其末尾添加.jpeg 以指定文件类型。

【讨论】:

以上是关于如何将互联网上的图像保存到 Python 中的本地文件的主要内容,如果未能解决你的问题,请参考以下文章

android如何将图像从互联网下载到本地存储?

如何在android中保存从相机拍摄的图像

如何将图像保存到java中的目录[关闭]

如何修复 Android 上的图像下载/保存错误

如何将照片库中的图像保存到应用程序的文档文件夹

触发图像点击事件时,如何将图像保存到手机内存(例如 SD 卡或本地硬盘驱动器)?