summaryrefslogtreecommitdiff
path: root/utils/utils_img/__init__.py
blob: 1b8c7672546e9ec43ce1842da52440f5bc9d58fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
'''
@File    :   __init__.py
@Time    :   2020/10/11 14:40:17
@Author  :   Kyomotoi
@Contact :   [email protected]
@Github  :   https://github.com/Kyomotoi
@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
'''
__author__ = 'kyomotoi'

import os
import string
import aiohttp
import PIL.Image as Image
from pathlib import Path
from random import sample

from PIL import Image
from PIL import ImageFile

async def aio_download_pics(url):
    """
    :说明:
    
      下载图片并重名文件
    
    :参数:

      * ``URL: str``: 目标网址
    
    :返回:

      文件根目录
    
    :用法:

    .. code-block:: python

        aio_download_pics(URL="https://www.demo.com/demo.jpg")

    """
    path = Path('.') / 'ATRI' / 'data' / 'data_Temp' / 'img'
    path = os.path.abspath(path)
    img_key = ''.join(sample(string.ascii_letters + string.digits, 16))
    img = path + f'\\{img_key}.png'
    async with aiohttp.ClientSession() as session:         
        async with session.get(url) as response:                
            pic = await response.read()    #以Bytes方式读入非文字                     
            with open(img, mode='wb') as f:# 写入文件
                f.write(pic)
                f.close()
    return img

def compress_image(outfile: str, kb=400, quality=85, k=0.9) -> str:
    """
    :说明:
    
      不改变图片尺寸压缩到指定大小,输出 base64 ,完成后自动删除文件
    
    :参数:

      * ``outfile: str``: 文件目录
      * ``kb=150``: 目标文件大小,单位:KB

    :返回:

      base64

    :用法:

    .. code-block:: python

        compress_image(outfile=C:/xxx)

    """
    o_size = os.path.getsize(outfile) // 1024
    if o_size <= kb:
        return outfile
   
    ImageFile.LOAD_TRUNCATED_IMAGES = True # type: ignore
    while o_size > kb:
        im = Image.open(outfile)
        x, y = im.size
        out = im.resize((int(x*k), int(y*k)), Image.ANTIALIAS)
        try:
            out.save(outfile, quality=quality)
        except Exception as e:
            print(e)
            break
        o_size = os.path.getsize(outfile) // 1024
    return outfile