recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment compresser la taille de l'image après le téléchargement en python

J'utilise flask框架,图片处理用的是pillow.

Généralement, le téléchargement se fait dans une logique de compression en bouclefiles,然后逐个file.save()
我希望在save完成后,执行pillow.

Mais il semblesave是一个I/O操作,存在延迟性,如果直接在file.save()下面直接调用pillowImage.open qu'une erreur se produira car les données de l'image n'ont pas été écrites dans l'image.

Que faire ?

PHPzPHPz2833 Il y a quelques jours817

répondre à tous(3)je répondrai

  • 習慣沉默

    習慣沉默2017-05-18 10:54:27

        def save(self, dst, buffer_size=16384):
            """Save the file to a destination path or file object.  If the
            destination is a file object you have to close it yourself after the
            call.  The buffer size is the number of bytes held in memory during
            the copy process.  It defaults to 16KB.
            For secure file saving also have a look at :func:`secure_filename`.
            :param dst: a filename or open file object the uploaded file
                        is saved to.
            :param buffer_size: the size of the buffer.  This works the same as
                                the `length` parameter of
                                :func:`shutil.copyfileobj`.
            """
            from shutil import copyfileobj
            close_dst = False
            if isinstance(dst, string_types):
                dst = open(dst, 'wb')
                close_dst = True
            try:
                copyfileobj(self.stream, dst, buffer_size)
            finally:
                if close_dst:
                    dst.close()

    Vous voyez que l'opération de sauvegarde n'est pas asynchrone


    Mise à jour

    copyfileobj est une opération bloquante

    https://github.com/pallets/we...

    répondre
    0
  • 阿神

    阿神2017-05-18 10:54:27

    En fait, pour ce type de traitement d'image, il est préférable d'utiliser directement OSS ou Qiniu d'Alibaba Cloud et d'autres fonctions de stockage similaires, puis de télécharger directement l'image sur OOS, puis d'appeler un suffixe spécial pour le traitement d'image spécifié. vous accéderez également à OSS pour le traitement de l'adresse. Cela peut non seulement éviter la charge liée à l'utilisation de votre propre serveur pour traiter les images, mais également réduire la pression d'accès, ce qui est également très bénéfique pour réduire la complexité du programme.

    répondre
    0
  • 某草草

    某草草2017-05-18 10:54:27

    Veuillez jeter un œil au paramètre fp de Image.open. Vous pouvez également utiliser un nom de fichier (chaîne), un objet pathlib.Path ou un objet fichier PIL.Image.open(fp, mode='r')

    Vous pouvez simplement transmettre le fichier à Image.open(file) directement !

    PIL.Image.open(fp, mode='r')
    Opens and identifies the given image file.
    
    This is a lazy operation; this function identifies the file, but the file remains open and the actual image data is not read from the file until you try to process the data (or call the load() method). See new().
    
    Parameters:    
    fp – A filename (string), pathlib.Path object or a file object. The file object must implement read(), seek(), and tell() methods, and be opened in binary mode.
    mode – The mode. If given, this argument must be “r”.
    Returns:    
    An Image object.
    
    Raises:    
    IOError – If the file cannot be found, or the image cannot be opened and identified.

    répondre
    0
  • Annulerrépondre