"可以使用python的open函数打开内存图像吗?"

2024-09-30 18:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个python库(poster),它以一个类似文件的对象作为参数,文档说明:

类文件对象必须支持.read()和.fileno()或两者都支持 .seek()和.tell()。在

我尝试过使用pythonopen函数的库,它工作得很好。我当前正在使用以下方法从URL下载图像:

access_token = "XXXXXXXXXXXXXXXXXXXXX"
postPhotoUrl = "https://graph.facebook.com/me/photos?access_token=%s" % access_token

register_openers()

# get image from external URL
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())

### data, headers = multipart_encode({"source":open("file.png")}) <- WORKS FINE
data, headers = multipart_encode({"source":data})
request = urllib2.Request(postPhotoUrl,data,headers)

编辑:我的目标是从外部URL获取图像,并使用facebook图形api发布。当我使用pythonopen函数时,我没有问题。当我尝试使用StringIO时,POST请求不会发送正文。


Tags: 文件对象函数图像imagecomtokenurl
1条回答
网友
1楼 · 发布于 2024-09-30 18:32:21

如果想法是使用^{}包来进行流式HTTP上传,那么不应该将图像数据转换为PIL Image对象。就这样。。。在

data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())

…然后可以将data变量传递给poster。在

当然,除非您想先用PIL转换图像,但您可能应该在您的问题中提到这一点。在

更新

至于为什么它用StringIO失败,可能是poster正在检查打开的文件的文件名,并用它来确定正确的Content-Type或类似的东西,当从StringIO读取时,它无法做到这一点。在

我从来没有使用过这个包,并且示例也不是很全面,但是当您调用类似的东西时,可能需要检查headers变量之间的差异。。。在

^{pr2}$

…与。。。在

^{3}$

更新2

看来我是对的。从第168-174行的poster源代码中。。。在

        if hasattr(value, 'read'):
            # Looks like a file object
            filename = getattr(value, 'name', None)
            if filename is not None:
                filetype = mimetypes.guess_type(filename)[0]
            else:
                filetype = None

…虽然如果filenameNone,则可能会有其他问题。试试这个。。。在

from poster.encode import multipart_encode, MultipartParam

data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
param = MultipartParam(name='source',
                       filename='image.png',
                       filetype='image/png',
                       fileobj=data)
datagen, headers = multipart_encode({"source": param})

相关问题 更多 >