Python urllib2图像扭曲

时间:2013-06-01 22:28:45

标签: python image urllib2 extraction

我正在使用网站http://placekitten.com创建一个程序,但我遇到了一些问题。使用这个:

im = urllib2.urlopen(url).read()
f = open('kitten.jpeg', 'w')
f.write(im)
f.close()

图像因颜色不匹配而失真,如下所示:

http://imgur.com/zVg64Kn.jpeg

我想知道是否有替代方法用urllib2提取图像。如果有人可以提供帮助,那就太棒了!

3 个答案:

答案 0 :(得分:4)

您需要以二进制模式打开文件:

f = open('kitten.jpeg', 'wb')

Python将以其他方式将行结尾转换为原生平台形式,这是一种打破二进制数据的转换,如open() function所述:

  

默认设置是使用文本模式,可以在写入时将'\n'个字符转换为特定于平台的表示,然后在读取时返回。因此,在打开二进制文件时,您应该将'b'附加到模式值以在二进制模式下打开文件,这将提高可移植性。

将数据从URL复制到文件时,您可以使用shutil.copyfileob()来有效地处理流式传输:

from shutil import copyfileobj

im = urllib2.urlopen(url)
with open('kitten.jpeg', 'wb') as out:
    copyfileobj(im, out)

这将以块的形式读取数据,避免使用大量二进制数据填充内存。 with语句处理为您关闭文件对象。

答案 1 :(得分:1)

更改

f = open('kitten.jpeg', 'w')

阅读

f = open('kitten.jpeg', 'wb')

有关详细信息,请参阅http://docs.python.org/2/library/functions.html#open。发生的事情是jpeg中的换行符在保存过程中被修改,而打开作为二进制文件将阻止这种情况。

答案 2 :(得分:0)

如果您使用的是Windows,则必须以二进制模式打开文件:

f = open('kitten.jpeg', 'wb')

或更多Python:

import urllib2

url = 'http://placekitten.com.s3.amazonaws.com/homepage-samples/200/140.jpg'
image = urllib2.urlopen(url).read()

with open('kitten.jpg', 'wb') as handle:
    handle.write(image)