本工具是通過將圖片上傳到第三方網(wǎng)站tinypng,進行壓縮后下載,覆蓋本地圖片,tinypng是一個強大的圖片處理網(wǎng)站,目前最可靠的無損壓縮網(wǎng)站。
代碼如下:
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
|
import requests from idna import unicode from selenium import webdriver import time import os browser = webdriver.Firefox(executable_path = '/Users/lyf/Library/Google/geckodriver' ) def tiny_png(url): # browser.get('https://tinypng.com/') upload_file = browser.find_element_by_tag_name( "input" ) try : upload_file.send_keys(url) browser.implicitly_wait( 20 ) a = browser.find_element_by_link_text( 'download' ) img_url = a.get_attribute( 'href' ) print (img_url) r = requests.get(img_url) with open (url, 'wb' ) as f: f.write(r.content) browser.refresh() time.sleep( 2 ) except Exception as e: print (e) def is_need_compress(img_path): """ 判斷是否需要壓縮處理 >10k 進行壓縮處理 :param img_path: :return: """ if img_path.endswith( '.jpg' ) or img_path.endswith( '.png' ): size = os.path.getsize(img_path) / 1024 if size > 10.0 : print ( '文件大小:%sk' % size) return True return False def file_loop(file_path): """ 遍歷文件夾 :param file_path: :return: """ files = os.listdir(file_path) for fi in files: fi_d = os.path.join(file_path, fi) if os.path.isdir(fi_d): file_loop(fi_d) else : child_path = os.path.join(file_path, fi_d) print (child_path) if is_need_compress(child_path): tiny_png(child_path) if __name__ = = "__main__" : file_path = "/Users/lyf/AndroidStudioProjects/fubei/new-fubei-android-2.5-up/app/src/main/assets/www/assets" browser.get( 'https://tinypng.com/' ) file_loop(file_path) |
改進版
優(yōu)化點:
1.遍歷完成本地文件夾再去上傳網(wǎng)站
2.所有圖片壓縮完成再去下載
3.啟動多線程下載
4.設(shè)定時間為加載完網(wǎng)絡(luò)就去上傳文件(非常非常重要,提速N倍)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
import requests from selenium import webdriver import time import os import _thread import threading from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By # browser = webdriver.Firefox(executable_path='/Users/lyf/Library/Google/geckodriver') browser = None image_map = {} compress_list = [] def tiny_png(url): """ 打開網(wǎng)站進行圖片上傳下載 :param url: :return: """ try : upload_file = WebDriverWait(browser, 10 ).until( EC.presence_of_element_located((By.TAG_NAME, "input" )) ) upload_file.send_keys(url) a = WebDriverWait(browser, 20 ).until( EC.presence_of_element_located((By.LINK_TEXT, "download" )) ) img_url = a.get_attribute( 'href' ) compress_list.remove(url) print (img_url) image_map[url] = img_url _thread.start_new_thread(sleep, ( 4 ,)) print ( '刷新網(wǎng)頁' ) browser.refresh() time.sleep( 2 ) except Exception as e: print (e.__str__()) browser.execute_script( 'window.stop()' ) def sleep(delay): """ 一定的時間后 未加載完網(wǎng)頁 只要控件加載出來就可以停止網(wǎng)頁加載 :param delay: :return: """ browser.set_page_load_timeout(delay) browser.set_script_timeout(delay) def down_img(file_path, down_url): """ 下載圖片覆蓋原地址 :param file_path: :param down_url: :return: """ r = requests.get(down_url) with open (file_path, 'wb' ) as f: f.write(r.content) print ( '下載完成:%s' % down_url) def is_need_compress(img_path): """ 判斷是否需要壓縮處理 >10k 進行壓縮處理 :param img_path: :return: """ if img_path.endswith( '.jpg' ) or img_path.endswith( '.png' ): size = os.path.getsize(img_path) / 1024 print (img_path) print ( '文件大小:%sk' % size) if size > 5000.0 : print ( '*****' * 30 ) print ( '這么大的圖片搞笑嗎' ) print (img_path) print ( '*****' * 30 ) if size > 0.0 and size < 10.0 : return True return False def file_loop(file_path, compress_list): """ 遍歷文件夾 :param file_path: :return: """ files = os.listdir(file_path) for fi in files: fi_d = os.path.join(file_path, fi) if os.path.isdir(fi_d): file_loop(fi_d, compress_list) else : child_path = os.path.join(file_path, fi_d) if is_need_compress(child_path): compress_list.append(child_path) def down_all(): """ 下載所有的圖片 :return: """ thread_list = [] for k, v in image_map.items(): print ( 'key:%s value:%s' % (k, v)) th = threading.Thread(target = down_img, args = (k, v)) th.start() thread_list.append(th) for r in thread_list: r.join() def loop_press(): """ 輪詢獲取下載地址 :return: """ for url in compress_list: tiny_png(url) def start_browser(): """ 啟動瀏覽器 :return: """ global browser browser = webdriver.Firefox(executable_path = '/Users/lyf/Library/Google/geckodriver' ) _thread.start_new_thread(sleep, ( 10 ,)) print ( '加載網(wǎng)頁' ) try : browser.get( 'https://tinypng.com/' ) except : browser.execute_script( 'window.stop()' ) if __name__ = = "__main__" : start_time = time.time() file_path = "/Users/lyf/Desktop/www/assets" # 獲取本地所有需要壓縮的圖片 file_loop(file_path, compress_list) print ( '符合條件的圖片有%s張' % len (compress_list)) start_browser() loop_press() while len (compress_list) > 0 : browser.quit() start_browser() loop_press() # 多線程下載拿到所有返回下載的地址 down_all() end = time.time() time_m = end - start_time print ( "time: " + str (time_m)) browser.quit() |
以上就是python如何實現(xiàn)圖片壓縮的詳細(xì)內(nèi)容,更多關(guān)于python 圖片壓縮的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://www.link-nemo.com/u/10025/post/168133