Home  >  Q&A  >  body text

How to compress image size after uploading in python

I use the flask framework, and I use pillow for image processing.

Generally uploading is done in a loop files, and then one by one file.save()
I hope to execute after save is completed The compression logic of pillow.

But it seems that save is an I/O operation and there is delay. If pillow is called directly under file.save() #Image.open, an error will occur because the image data has not been written to the image.

What to do?

PHPzPHPz2616 days ago603

reply all(3)I'll reply

  • 習慣沉默

    習慣沉默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()

    你看save操作不是异步的吖


    更新

    copyfileobj是个阻塞操作

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

    reply
    0
  • 阿神

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

    其实这类图片处理,直接使用阿里云的OSS或者七牛等类似的存储功能更好,直接将图片上传到OOS中,然后调用特别的后缀进行指定的图片处理,未来也访问OSS上处理后的地址。这样既可以规避用自己服务器处理图片的负荷,而且也降低了访问的压力,对于降低程序的复杂度也是大有好处的。

    reply
    0
  • 某草草

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

    楼主看看Image.open 的fp参数,也可以A filename (string), pathlib.Path object or a file object PIL.Image.open(fp, mode='r')

    你直接传file给Image.open(file)就可以了吧!

    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.

    reply
    0
  • Cancelreply