向上缩放由scrapy图像管道

时间:2016-03-07 15:00:39

标签: python-2.7 scrapy scrapy-spider scrapy-pipeline

我试图用herited ImagesPipeline类覆盖我的pipeline.py中的convert_image方法,但是它没有按预期工作。

实际上,我只是试图升级下载到我的要求的图像:700px,但下载的图像仍然是原始大小 我也在scrapy之外测试了调整大小的功能并且效果很好

有关信息我没有在我的设置IMAGES_THUMBS中使用,因此尺寸应为None且IMAGES_EXPIRES = 0

如果有人有一个很好的解决方案,可以在不符合此要求的情况下直接将下载的图像转换为700x700最小转换。

这是我的代码:

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)

    def convert_image(self, image, size=None):
        if image.format == 'PNG' and image.mode == 'RGBA':
            background = Image.new('RGBA', image.size, (255, 255, 255))
            background.paste(image, image)
            image = background.convert('RGB')
        elif image.mode != 'RGB':
            image = image.convert('RGB')
        if size is None:
            image = image.copy()
            basewidth = 700
            wpercent = (basewidth/float(image.size[0]))
            hsize = int((float(image.size[1])*float(wpercent)))
            image.resize((basewidth,hsize), Image.ANTIALIAS)
            #image = image.copy()
            #image.thumbnail(size, Image.ANTIALIAS)

       buf = BytesIO()
       try:
            image.save(buf, 'JPEG')
       except Exception, ex:
            raise ImageException("Cannot process image. Error: %s" % ex)

       return image, buf

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

这是我试图覆盖的原始管道图像类: github

1 个答案:

答案 0 :(得分:0)

您好像正在使用PILPillowresize无法就地修改图片,返回新图片。所以你需要这个:

image = image.resize((basewidth,hsize), Image.ANTIALIAS)
^^^^^^^^