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实现C4.5决策树算法
Aug 29 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
python爬取内容存入Excel实例
Feb 20 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Tensorflow限制CPU个数实例
Feb 06 Python
python构造IP报文实例
May 05 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Python 解决空列表.append() 输出为None的问题
May 23 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获取MySql新增记录ID值的3种方法
2014/06/24 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
Javascript的闭包
2009/12/31 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python实现的批量下载RFC文档
2015/03/10 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
python实现对输入的密文加密
2019/03/20 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
英国网上花店:Bunches
2016/11/29 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
数据库基础的一些面试题
2012/02/25 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
元旦晚会策划方案
2014/02/18 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
慰问信范文
2015/02/14 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
python Tkinter的简单入门教程
2021/04/11 Python