python使用bytesIO 實現圖片在內存中壓縮上傳阿里雲


需要在從阿里雲獲取圖片,進行圖像處理,然后將生成圖壓縮到500kb以下上傳到oss,不進行文件本地操作
但是圖片壓縮需要用到 Image.save 函數,需要傳入一個本地路徑,這里可以使用bytesIO解決,
不斷修改 Image.save 的參數 quality 改變 生成圖的大小直到小於 500kb

import oss2
import PIL

class OssFile(object):
    def __init__(self):
        self.auth = oss2.Auth(config.OSS_ACCESS_KEY_ID, config.OSS_ACCESS_KEY_SECRET)
        self.bucket = oss2.Bucket(self.auth, config.OSS_END_POINT, config.OSS_BUCKET_NAME)

    def put_object(self,ossfile,localfile):
        self.bucket.put_object(ossfile,localfile)
    
    def get_oss_file(self,ossfile):
        return self.bucket.get_object(ossfile)

if __name__== "__main__":
    oss_obj = OssFile()
    #image = Image.open(r"test.jpg")
    image = oss_obj.get_oss_file("oss_key")
    save_quality = 95
    query_sum = 0
    size = 512000
    while True:
        img_byte_arr = io.BytesIO()
        query_sum += 1
        image.save(img_byte_arr, quality=save_quality)
        pic_size_bytes = img_byte_arr.tell()
        if pic_size_bytes < size : 
            break
        if isinstance(save_quality, int) and query_sum < 90:
            save_quality = int(save_quality) - int(query_sum)
            continue
        else:
            break
        img_byte_arr = img_byte_arr.getvalue()
        oss_obj.put_object("save_path", img_byte_arr)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM