scrapy convert_image

Я использую Scrapy, чтобы сканировать некоторые изображения, изображения должны вырезать часть или добавить водяной знак. Я перезаписываю функцию convert_image в pipelines.py но это не сработало. Код выглядит так:

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

Есть идеи?

ОБНОВИТЬ:

@warwaruk

как вы решили, что это не сработало? какое-то исключение или что? <без исключения. Я использую этот код для перезаписи функции item_completed. И он работает хорошо, вот код:

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

1 ответ

ImagePipleline конвертирует изображения в JPEG(режим RGB) автоматически, и "переключателя" не существует. Хотя вы можете изменить его значение, он может испортить другую логику. Так что лучше использовать MediaPipeline - просто скачайте файлы. Вы можете написать другое приложение для последующей обработки файлов изображений. Это сделает вашу логику ясной и сделает скрап быстрее.

Другие вопросы по тегам