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 28 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
python 提取key 为中文的json 串方法
Dec 31 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
Python生成器常见问题及解决方案
Mar 21 Python
Python中无限循环需要什么条件
May 27 Python
python能在浏览器能运行吗
Jun 17 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
德劲1103的维修打理经验
2021/03/02 无线电
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
python实现Adapter模式实例代码
2018/02/09 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
最新大学生自我评价
2013/09/24 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
找工作求职信
2014/07/07 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
房屋出租委托书格式
2014/09/23 职场文书
爱心捐书倡议书
2015/04/27 职场文书
计划生育目标责任书
2015/05/09 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
如何做好员工培训计划?
2019/07/09 职场文书