成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

怎么使用python對(duì)圖片進(jìn)行批量壓縮

89542767 / 590人閱讀

  小編寫這篇文章的主要目的,主要是講解一些關(guān)于python的事情,比如需要對(duì)圖片進(jìn)行批量壓縮,壓縮的方法還是比較的多的,那么,為了提高效率,怎么進(jìn)行批量壓縮呢?下面就給大家詳細(xì)解答下。


  前言


  最近在研究怎么對(duì)圖片資源進(jìn)行無損壓縮,網(wǎng)上也找了一些資料??偠灾?,收獲不少,所以想對(duì)最近的學(xué)習(xí)做個(gè)總結(jié)。


  無損壓縮其實(shí)是相對(duì)而言的,目的是為了減小圖片資源的內(nèi)存大小但又不影響圖片的顯示質(zhì)量。下面我將介紹兩種批量壓縮圖片的方法,方法一是使用python和Pillow模塊對(duì)圖片進(jìn)行壓縮,這個(gè)方法對(duì)jpeg格式的圖片有非常高的壓縮效率,但該方法不太適合對(duì)png圖片進(jìn)行壓縮。另一個(gè)方式是使用Python和Selenium模塊操縱Squoosh批量壓縮圖片。


  使用Python和Pillow模塊壓縮圖片


  Pillow是Python上一個(gè)功能非常強(qiáng)大的圖形處理庫,若本地還沒安裝,可以通過指令:pip install Pillow安裝。使用Pillow進(jìn)行壓縮的策略大致總結(jié)為三個(gè):1、優(yōu)化flag,2、漸進(jìn)式JPEG,3、JPEG動(dòng)態(tài)質(zhì)量。


  我們先用Python寫一個(gè)簡(jiǎn)單的保存圖片的例子:


  from PIL import Image
  from io import StringIO
  import dynamic_quality
  im=Image.open("photo.jpg")
  print(im.format,im.size,im.mode)
  new_photo=im.copy()
  new_photo.thumbnail(im.size,resample=Image.ANTIALIAS)
  save_args={'format':im.format}
  if im.format=='JPEG':
  save_args['quality'].value=85
  new_photo.save("copy_photo.jpg",**save_args)
  1、優(yōu)化flag
  開啟optimize設(shè)置,這是以CPU耗時(shí)為代價(jià)節(jié)省額外的文件大小,由于本質(zhì)沒變,對(duì)圖片質(zhì)量沒有絲毫影響。
  ...
  if im.format=='JPEG':
  save_args['quality'].value=85
  save_args['optimize']=True
  ...


  2、漸進(jìn)式JPEG


  當(dāng)我們將一張圖片保存為JPEG時(shí),你可以從下面的選項(xiàng)中選擇不同的類型:


  標(biāo)準(zhǔn)型:JPEG圖片自上而下載入。


  漸進(jìn)式:JPEG圖片從模糊到清晰載入。


  漸進(jìn)式的選項(xiàng)可以在Pillow中輕松的啟用(progressive=True)。漸進(jìn)式文件的被打包時(shí)會(huì)有一個(gè)小幅的壓縮。


  ...
  if im.format=='JPEG':
  save_args['quality'].value=85
  save_args['optimize']=True
  save_args['progressive=True']=True
  ...


  3、JPEG動(dòng)態(tài)質(zhì)量


  最廣為人知的減小JPEG文件大小的方法就是設(shè)置quality。很多應(yīng)用保存JPEG時(shí)都會(huì)設(shè)置一個(gè)特定的質(zhì)量數(shù)值。


  質(zhì)量其實(shí)是個(gè)很抽象的概念。實(shí)際上,一張JPEG圖片的每個(gè)顏色通道都有不同的質(zhì)量。質(zhì)量等級(jí)從0到100在不同的顏色通道上都對(duì)應(yīng)不同的量化表,同時(shí)也決定了有多少信息會(huì)丟失。


  在信號(hào)域量化是JPEG編碼中失去信息的第一個(gè)步驟。


  我們可以動(dòng)態(tài)地為每一張圖片設(shè)置最優(yōu)的質(zhì)量等級(jí),在質(zhì)量和文件大小之間找到一個(gè)平衡點(diǎn)。我們有以下兩種方法可以做到這點(diǎn):


  Bottom-up:這些算法是在8x8像素塊級(jí)別上處理圖片來生成調(diào)優(yōu)量化表的。它們會(huì)同時(shí)計(jì)算理論質(zhì)量丟失量和和人眼視覺信息丟失量。


  Top-down:這些算法是將一整張圖片和它原版進(jìn)行對(duì)比,然后檢測(cè)出丟失了多少信息。通過不斷地用不同的質(zhì)量參數(shù)生成候選圖片,然后選擇丟失量最小的那一張。


  我們選擇第二種方法:使用二分法在不同的質(zhì)量等級(jí)下生成候選圖片,然后使用pyssim計(jì)算它的結(jié)構(gòu)相似矩陣(SSIM)來評(píng)估每張候選圖片損失的質(zhì)量,直到這個(gè)值達(dá)到非靜態(tài)可配置的閾值為止。這個(gè)方法讓我們可以有選擇地降低文件大?。ê臀募|(zhì)量),但是只適用于那些即使降低質(zhì)量用戶也察覺不到的圖片。


  下面是計(jì)算動(dòng)態(tài)質(zhì)量的代碼dynamic_quality.py:


  import PIL.Image
  from math import log
  from SSIM_PIL import compare_ssim
  def get_ssim_at_quality(photo,quality):
  """Return the ssim for this JPEG image saved at the specified quality"""
  ssim_photo="tmp.jpg"
  #optimize is omitted here as it doesn't affect
  #quality but requires additional memory and cpu
  photo.save(ssim_photo,format="JPEG",quality=quality,progressive=True)
  ssim_score=compare_ssim(photo,PIL.Image.open(ssim_photo))
  return ssim_score
  def _ssim_iteration_count(lo,hi):
  """Return the depth of the binary search tree for this range"""
  if lo>=hi:
  return 0
  else:
  return int(log(hi-lo,2))+1
  def jpeg_dynamic_quality(original_photo):
  """Return an integer representing the quality that this JPEG image should be
  saved at to attain the quality threshold specified for this photo class.
  Args:
  original_photo-a prepared PIL JPEG image(only JPEG is supported)
  """
  ssim_goal=0.95
  hi=85
  lo=80
  #working on a smaller size image doesn't give worse results but is faster
  #changing this value requires updating the calculated thresholds
  photo=original_photo.resize((400,400))
  #if not _should_use_dynamic_quality():
  #default_ssim=get_ssim_at_quality(photo,hi)
  #return hi,default_ssim
  #95 is the highest useful value for JPEG.Higher values cause different behavior
  #Used to establish the image's intrinsic ssim without encoder artifacts
  normalized_ssim=get_ssim_at_quality(photo,95)
  selected_quality=selected_ssim=None
  #loop bisection.ssim function increases monotonically so this will converge
  for i in range(_ssim_iteration_count(lo,hi)):
  curr_quality=(lo+hi)//2
  curr_ssim=get_ssim_at_quality(photo,curr_quality)
  ssim_ratio=curr_ssim/normalized_ssim
  if ssim_ratio>=ssim_goal:
  #continue to check whether a lower quality level also exceeds the goal
  selected_quality=curr_quality
  selected_ssim=curr_ssim
  hi=curr_quality
  else:
  lo=curr_quality
  if selected_quality:
  return selected_quality,selected_ssim
  else:
  default_ssim=get_ssim_at_quality(photo,hi)
  return hi,default_ssim
  然后在下面的代碼中引用計(jì)算動(dòng)態(tài)質(zhì)量的方法:
  ...
  if im.format=='JPEG':
  save_args['quality'],value=dynamic_quality.jpeg_dynamic_quality(im)
  save_args['optimize']=True
  save_args['progressive']=True
  ...


  使用Python和Selenium模塊操縱Squoosh批量壓縮圖片


  Squoosh是谷歌發(fā)布的一款開源的圖片在線壓縮服務(wù)(偽),雖然需要用瀏覽器打開,但其實(shí)是一個(gè)整合了許多命令行工具的前端界面,調(diào)用的是本地的計(jì)算資源,所以只要打開過Squoosh一次,之后都會(huì)秒開,并且離線使用。不過最大的缺點(diǎn)就是不可以批量處理,如果我們要處理大量的圖片資源,一張張地進(jìn)行壓縮處理將會(huì)消耗大量的人力成本和時(shí)間成本,這明顯是不能接受的。我們要解決的問題就是寫一個(gè)腳本來模擬瀏覽器的操作,使我們的雙手得到解放。


  Python調(diào)用Selenium


  這是Squoosh的主界面,Select an Image其實(shí)是一個(gè)輸入框,那我們直接用Selenium把本地圖片的路徑輸入進(jìn)去就行了:


  輸入圖片路徑之后就會(huì)默認(rèn)壓縮成75%質(zhì)量的MozJPEG,我覺得無論是壓縮比和質(zhì)量都很不錯(cuò),所以就沒有改,等待頁面加載完成之后就直接下載:


  我們可以認(rèn)為出現(xiàn)"..%smaller"就算是壓縮完成,這時(shí)候直接點(diǎn)擊右邊的下載按鈕即可。


  代碼:


  from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.support.ui import Select
  import os
  import re
  driver=webdriver.Chrome('C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe')
  #列出目錄下所有的圖片,存在images這個(gè)列表中
  images=os.listdir('C:/Users/admin/Pictures/Saved Pictures')
  #處理所有圖片
  for i in range(len(images)):
  #構(gòu)建圖片路徑
  path='C:/Users/admin/Pictures/Saved Pictures/'+images<i>
  #嘗試處理所有圖片
  try:
  #打開Squoosh
  driver.get('https://squoosh.app')
  #找到輸入框
  input_box=driver.find_element_by_xpath('.//input[class="_2zg9i"]')
  #輸入圖片路徑
  input_box.send_keys(path)
  #設(shè)置圖片格式
  select1=Select(driver.find_elements_by_css_selector('select')[-1])
  if re.match('.*.png',images<i>):
  select1.select_by_value("png")
  if re.match('.*.jpg',images<i>):
  select1.select_by_value("mozjpeg")
  #等待出現(xiàn)'smaller'字樣,10秒不出現(xiàn)則視為處理失敗
  locator=(By.XPATH,'.//span[class="_1eNmr _1U8bE"][last()]')
  WebDriverWait(driver,25).until(EC.text_to_be_present_in_element(locator,'smaller'))
  #找到下載按鈕
  button=driver.find_elements_by_xpath('.//a[title="Download"]')[-1]
  #點(diǎn)擊下載按鈕
  button.click()
  #輸出處理失敗的圖片路徑
  except:
  print('*'*30)
  print('Error:'+path+'failed!')
  print('*'*30)
  continue

  到此為止,這篇文章就給大家介紹到這里了,希望可以為各位讀者帶來一定的幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128239.html

相關(guān)文章

  • 10 行 Python 代碼,批量壓縮圖片 500 張,簡(jiǎn)直太強(qiáng)大了

    摘要:這個(gè)網(wǎng)站非常良心,開放了免費(fèi)的,取消了每張大小的限制,只限定每個(gè)月處理張圖片。 showImg(https://segmentfault.com/img/remote/1460000019115596?w=4272&h=2848); 本文原創(chuàng)并首發(fā)于公眾號(hào)【Python貓】,未經(jīng)授權(quán),請(qǐng)勿轉(zhuǎn)載。原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1...

    Steven 評(píng)論0 收藏0
  • 數(shù)據(jù)分析遇到PDF文本,怎么Python批量提取內(nèi)容

    摘要:復(fù)雜系統(tǒng)仿真的微博客虛假信息擴(kuò)散模型研究面向影子分析的社交媒體競(jìng)爭(zhēng)情報(bào)搜集面向人機(jī)協(xié)同的移動(dòng)互聯(lián)網(wǎng)政務(wù)門戶探析經(jīng)驗(yàn)證。微博客的企業(yè)競(jìng)爭(zhēng)情報(bào)搜集移動(dòng)社交媒體用戶隱私保護(hù)對(duì)策研究注意這里的提示,原先的個(gè)文件沒有被再次抽取,只有個(gè)新文件被抽取。 showImg(https://segmentfault.com/img/bVbiU7y?w=1000&h=508); 本文為你展示,如何用Pyth...

    cloud 評(píng)論0 收藏0
  • 機(jī)器學(xué)習(xí),了解一下?

    摘要:歡迎常來為什么要學(xué)老師上課時(shí)候就說過傳統(tǒng)算法解決確定性問題,而機(jī)器學(xué)習(xí)解決非確定性問題。機(jī)器學(xué)習(xí)算法機(jī)器學(xué)習(xí)算法和普通算法還是有很大區(qū)別的。而自動(dòng)駕駛等前言機(jī)器人,都使用了增強(qiáng)學(xué)習(xí)。學(xué)習(xí)資料在線課程入門機(jī)器學(xué)習(xí)經(jīng)典算法與應(yīng)用書籍機(jī)器學(xué)習(xí)實(shí)戰(zhàn) 文章圖片來源于 GitHub,網(wǎng)速不佳的朋友請(qǐng)點(diǎn)我看原文。 順便軟廣一下個(gè)人技術(shù)小站:godbmw.com。歡迎常來?(^?^*) 1. 為什么要...

    jsbintask 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<