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实现在每个独立进程中运行一个函数的方法
Apr 23 Python
python中import与from方法总结(推荐)
Mar 21 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
django 微信网页授权登陆的实现
Jul 30 Python
python如何将多个PDF进行合并
Aug 13 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
python序列化与数据持久化实例详解
Dec 20 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
PyTorch的torch.cat用法
Jun 28 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
python中温度单位转换的实例方法
Dec 27 Python
详解Python常用的魔法方法
Jun 03 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下删除字符串中HTML标签的函数
2008/08/27 PHP
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
js下弹出窗口的变通
2007/04/18 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python super()函数使用及多重继承
2020/05/06 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
德国旅游网站:weg.de
2018/06/03 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
机关党建工作汇报材料
2014/08/20 职场文书
个人合伙协议书范本
2014/10/14 职场文书
电力工程合作意向书
2015/05/11 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
python pygame 开发五子棋双人对弈
2022/05/02 Python