【问题标题】:Python urllib2 Images DistortedPython urllib2 图像失真
【发布时间】:2013-06-01 22:28:44
【问题描述】:

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

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

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

http://imgur.com/zVg64Kn.jpeg

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

【问题讨论】:

    标签: python image urllib2 extraction


    【解决方案1】:

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

    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 语句为您处理关闭文件对象。

    【讨论】:

      【解决方案2】:

      改变

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

      阅读

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

      请参阅http://docs.python.org/2/library/functions.html#open 了解更多信息。发生的情况是 jpeg 中的换行符在保存过程中被修改,并且作为二进制文件打开会阻止这种情况。

      【讨论】:

        【解决方案3】:

        如果您使用的是 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多