2012-03-09 44 views
2

我使用Scrapy来抓取一些图像,图像需要剪下一个部分或添加水印。我覆盖pipelines.py中的函数convert_image,但它不起作用。代码如下所示:scrapy convert_image

class MyImagesPipeline(ImagesPipeline): 

    def get_media_requests(self, item, info): 
     for image_url in item['image_urls']: 
      yield 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: 
      image = image.copy() 
      image.thumbnail(size, Image.ANTIALIAS) 
     else: 
      # cut water image TODO use defined image replace Not cut 
      x,y = image.size 
      if(y>120): 
       image = image.crop((0,0,x,y-25)) 

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

     return image, buf 

任何想法?

UPDATE:

@warwaruk

你怎么样决定了它没有工作?任何异常还是什么? <也不例外。我使用重写功能的代码item_completed.and它的作品好,这里是代码:自动

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") 

    if item['refer'] == 'someurl.com' : 
     for a in image_paths: 
      o_img = os.path.join(self.store.basedir,a) 

      if os.path.isfile(o_img): 
       image = Image.open(o_img) 
       x,y = image.size 
       if(y>120): 
        image = image.crop((0,0,x,y-35)) 
        image.save(o_img,'JPEG'); 

    return item 
+0

你确定你的管道被调用吗?你在设置中启用了它吗? – warvariuc 2012-03-11 13:49:15

+0

是的,我确定,图片已经下载。 – kongkong 2012-03-13 09:34:17

+0

>我覆盖了pipelinelines.py中的函数convert_imag,但它没有工作。 <你怎么认定它不起作用?任何异常还是什么? – warvariuc 2012-03-13 10:07:57

回答

4

ImagePipleline图像转换为JPEG(RGB模式),并没有“toggler”的存在。虽然你可以修改它的暗示,但它可能会混淆其他逻辑。所以,使用MediaPipeline更好 - 只需下载文件。 您可以编写另一个应用程序来为图像文件进行后期处理。它使你的逻辑清晰,并使scrapy更快。