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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
python实现停车管理系统
Nov 30 Python
Python玩转Excel的读写改实例
Feb 22 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
python通过移动端访问查看电脑界面
Jan 06 Python
Python实现点云投影到平面显示
Jan 18 Python
Python实现自动签到脚本功能
Aug 20 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
使用python对excel表格处理的一些小功能
Jan 25 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
很实用的一个完整email发送程序
2006/10/09 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
php curl_init函数用法
2014/01/31 PHP
PHP错误机制知识汇总
2016/03/24 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
Melissa香港官网:MDreams
2016/07/01 全球购物
大学生求职计划书
2014/04/30 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
商业门面租房协议书
2014/11/25 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
小学数学教学随笔
2015/08/14 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Linux中文件的基本属性介绍
2022/06/01 Servers