2012-03-09 76 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更快。