2012-03-09 15 views
2

私はScrapyを使っていくつかの画像をクロールします。画像は一部を切り取るか、ウォーターマークを追加する必要があります。 convert_imagepipelines.pyに上書きしても機能しませんでした。コードは次のようになります。治療法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

あなたはそれが機能しなかったことを決めましたか?任意の例外または何ですか? <例外が書き換え機能のためにこのコードを使用しない.Iはそれが良い作品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

+0

はい、確かです。画像がダウンロードされました。 – kongkong

+0

>私はpipelines.pyの関数convert_imagを上書きします。しかし、うまくいきませんでした。あなたはそれがうまくいかないと決めたのですか?任意の例外または何ですか? – warvariuc

答えて

4

ImagePiplelineは自動的にJPEG(RGBモード)に画像を変換し、そして何の「トグラーは」存在しません。その実装を変更することはできますが、他のロジックを混乱させる可能性があります。したがって、MediaPipelineを使用する方が良いです - ファイルをダウンロードするだけです。 イメージファイルの後処理を行う別のアプリケーションを作成することができます。それはあなたのロジックを明確にし、より速く治療を行います。