python如何实现图片压缩


Posted in Python onSeptember 11, 2020

本工具是通过将图片上传到第三方网站tinypng,进行压缩后下载,覆盖本地图片,tinypng是一个强大的图片处理网站,目前最可靠的无损压缩网站。

代码如下:

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)

改进版

优化点:

1.遍历完成本地文件夹再去上传网站

2.所有图片压缩完成再去下载

3.启动多线程下载

4.设定时间为加载完网络就去上传文件(非常非常重要,提速N倍)

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):
  """
  打开网站进行图片上传下载
  :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('刷新网页')
    browser.refresh()
    time.sleep(2)
  except Exception as e:
    print(e.__str__())
    browser.execute_script('window.stop()')


def sleep(delay):
  """
  一定的时间后 未加载完网页 只要控件加载出来就可以停止网页加载
  :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('加载网页')
  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如何实现图片压缩的详细内容,更多关于python 图片压缩的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python和bash统计CPU利用率的方法
Jul 10 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
python3个性签名设计实现代码
Jun 19 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
pytorch中[..., 0]的用法说明
May 20 Python
Python实现8种常用抽样方法
Jun 27 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 #Python
详解Python中import机制
Sep 11 #Python
python使用隐式循环快速求和的实现示例
Sep 11 #Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 #Python
降低python版本的操作方法
Sep 11 #Python
Django crontab定时任务模块操作方法解析
Sep 10 #Python
Django日志及中间件模块应用案例
Sep 10 #Python
You might like
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
JavaScript 数组详解
2013/10/10 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
python正则实现提取电话功能
2018/02/24 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
python自定义函数def的应用详解
2020/06/03 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
法学研究生自我鉴定范文
2013/12/04 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
Python Flask实现进度条
2022/05/11 Python
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android