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使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python批量转换文件编码格式
May 17 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
基于python的字节编译详解
Sep 20 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
实现Python与STM32通信方式
Dec 18 Python
python能在浏览器能运行吗
Jun 17 Python
pymysql模块使用简介与示例
Nov 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
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
详解python itertools功能
2020/02/07 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
公司庆典欢迎词
2015/01/26 职场文书
同意离婚答辩状
2015/05/22 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
浅析Python实现DFA算法
2021/06/26 Python
聊聊Python String型列表求最值的问题
2022/01/18 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python