成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python自動化辦公之玩轉圖片

開發 后端 自動化
有很多非 IT 行業的朋友都在學 Python,他們的目的也很簡單,就是想提高下工作效率,簡單重復的工作希望用 Python 搞定。

[[410295]]

 本文轉載自微信公眾號「Python七號」,作者somenzz。轉載本文請聯系Python七號公眾號。

有很多非 IT 行業的朋友都在學 Python,他們的目的也很簡單,就是想提高下工作效率,簡單重復的工作希望用 Python 搞定。

因此我準備寫一些 Python 自動化辦公系列相關文章,代碼都是可以在 Python3 上正確運行的,復制下代碼,再調整下細節,就可以使用。

首先發在公眾號上,然后同步到知識星球。

為什么同步到知識星球,因為公眾號的文章修改起來非常麻煩,而知識星球就比較簡單了,這樣文章里的代碼可以不停迭代更新,重要的是有問題還可以一對一進行提問。加入星球的方式后續會公布。

在日常的工作生活中,我們會經常與圖片打交道,比如下載圖片,壓縮圖片,刪除圖片的元數據防止隱私泄漏,拼接長圖,圖片文字識別,加水印等等。

今天就來分享下如何簡單的使用 Python 來玩轉這些操作。

1、下載圖片

下載圖片是最簡單的操作了,無非就是先找到圖片的 url,使用標準庫或者 requests 庫去請求這個 url,然后將得到的數據保存為文件即可。

下面分享三種方法來下載圖片。

方法一,使用標準庫。

  1. from urllib.request import urlretrieve 
  2. from pathlib import Path 
  3. import ssl 
  4. def urllib_download(img_url, download_path): 
  5.     ssl._create_default_https_context = ssl._create_unverified_context 
  6.     urlretrieve(img_url, Path(download_path) / 'image1.png')  

方法二,使用 requests。

  1. import requests 
  2. def request_download(img_url, download_path): 
  3.     r = requests.get(img_url) 
  4.     with open(f'{download_path}/image2.png''wb'as f: 
  5.         f.write(r.content) 

方法二,使用 requests 的流式下載,適用于較大,網速慢,容易下載失敗的圖片。

  1. import requests 
  2. def requests_chunk_download(img_url, download_path): 
  3.     r = requests.get(img_url, stream=True)     
  4.     with open(f'{download_path}/image3.png''wb'as f: 
  5.         for chunk in r.iter_content(chunk_size=32): 
  6.             f.write(chunk) 

分別下載一個圖片看看結果:

  1. if __name__ == '__main__'
  2.     img_url = 'https://tinypng.com/images/panda-developing-2x.png' 
  3.     download_path = Path('/Users/aaron/tmp/images'
  4.     download_path.mkdir(exist_ok=True
  5.     urllib_download(img_url,download_path.as_posix()) 
  6.     request_download(img_url, download_path.as_posix()) 
  7.     requests_chunk_download(img_url, download_path.as_posix()) 

三種方法下載圖片的大小是一樣的。

如果自動下載某網站的全部圖片,其實一點也不復雜,無非就是找規律,如何獲取全部圖片的 url,然后循環調用以上三個函數。

獲取圖片 url 可能會涉及正則表達式,關于正則表達式,可以參考前文學會正則表達式,玩弄文本于股掌之中

2、壓縮圖片

有一次我用郵箱向老板發送 5 張圖片時,foxmail 提示我是否啟用 QQ 郵箱的超大附件功能,原來 5 張圖片已經 40+ MB,現在的手機拍攝的真是太清晰了。

不過工作中的圖片能看清楚內容就可以了,完全沒有必要整那么清晰,文件太大,發給老板,老板打開圖片也會卡,體驗非常不好,于是我就想如何使用 Python 來壓縮圖片。

找了很多方法,都不是很理想,有的軟件下載后才發現是付費的,有的在使用時直接導致程序卡死,有的壓縮率不夠需要多次壓縮,有的要求原始圖片大小不能超過 5 M 有的失真有些嚴重。

直到我用了 tinypng 的 api 接口,才發現這真的好用,圖片幾乎不失真,大多都控制在 1 MB 之內,在此分享給大家。

先打開 https://tinypng.com/developers, 在下方輸入你的用戶名和郵箱,就可以獲取一個 API KEY。

然后 pip 安裝一下這個庫:

  1. pip install tinify 

編寫三行代碼就可以對圖片進行壓縮處理了:

  1. import tinify 
  2. tinify.key = '此處填入你的key' 
  3. tinify.from_file(src_img_path).to_file(dst_img_path) 

其中 src_img_path 是原圖片,dst_img_path 是壓縮后的圖片。

比如找個目錄,對文件批量壓縮一下:

  1. import tinify 
  2. from pathlib import Path 
  3. import os 
  4.  
  5. tinify.key = '此處填入你的key' 
  6. path = "/Users/aaron/Documents/個人/origin" # 圖片存放的路徑 
  7.  
  8. for dirpath, dirs, files in os.walk(path): 
  9.     for file in files: 
  10.         file = Path(dirpath)/Path(file) 
  11.         if file.suffix.lower() in ['.jpg','.png','.gif']: 
  12.             print("compressing ..."+ file.as_posix()) 
  13.             tinify.from_file(file.as_posix()).to_file(file.with_suffix(".compressed.jpg").as_posix()) 

可以看到,壓縮后的文件大小在 1M 左右或 1M 之內,打開文件對比,基本看不出任何區別:

3、刪除圖片的元數據

現在大部分快遞已經可以對地址信息進行加密,大家的隱私保護意識也越來越高,可是一不小心,你隨手發布的照片就可能暴露了你的位置信息。

因此,用戶發布照片時去除照片的位置、設備、時間等隱私信息顯得很有必要,這些信息又叫元數據,也就是 metadata。

Python 刪除圖片的元數據是有一個三方庫 piexif,我使用它刪除后,再用 exiftool 查看時,仍然可以查到許多隱私信息。

也就是說 piexif 刪除的不夠徹底,于是我用 Python 封裝了 exiftool,這下,圖片的元數據可以刪除的干干凈凈。

文件 exif_tool.py 代碼如下:

  1. import subprocess 
  2. import os 
  3. import json 
  4. from pathlib import Path 
  5. class ExifTool(object): 
  6.  
  7.     sentinel = "{ready}\n" 
  8.     #windows 
  9.     #sentinel = "{ready}\r\n" 
  10.  
  11.     def __init__(self, executable="/usr/bin/exiftool"): 
  12.         exiftool1 = Path("/usr/bin/exiftool"
  13.         exiftool2 = Path("/usr/local/bin/exiftool"
  14.         self.executable = executable 
  15.         if exiftool1.exists(): 
  16.             self.executable = exiftool1.as_posix() 
  17.         elif exiftool2.exists(): 
  18.             self.executable = exiftool2.as_posix() 
  19.         else
  20.             if Path(self.executable).exists(): 
  21.                 pass 
  22.             else
  23.                 raise FileNotFoundError(self.executable) 
  24.  
  25.  
  26.     def __enter__(self): 
  27.         self.process = subprocess.Popen( 
  28.             [self.executable, "-stay_open""True",  "-@""-"], 
  29.             universal_newlines=True
  30.             stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
  31.         return self 
  32.  
  33.     def __exit__(self, exc_type, exc_value, traceback): 
  34.         self.process.stdin.write("-stay_open\nFalse\n"
  35.         self.process.stdin.flush() 
  36.  
  37.     def execute(self, *args): 
  38.         args = args + ("-execute\n",) 
  39.         self.process.stdin.write(str.join("\n", args)) 
  40.         self.process.stdin.flush() 
  41.         output = "" 
  42.         fd = self.process.stdout.fileno() 
  43.         while not output.endswith(self.sentinel): 
  44.             # output += os.read(fd, 4096).decode('utf-8',errors=) 
  45.             output += os.read(fd, 4096).decode('utf-8',"ignore"
  46.         return output[:-len(self.sentinel)] 
  47.  
  48.     def get_metadata(self, *filenames): 
  49.         ""
  50.         返回多個文件的 exif 信息 
  51.         ""
  52.         return json.loads(self.execute("-G""-j""-n", *filenames)) 
  53.  
  54.     def get_exif_info(self, source_img): 
  55.         ""
  56.         返回單個文件的 exif 信息 
  57.         ""
  58.         return self.get_metadata(source_img)[0] 
  59.  
  60.     def delete_exif_info(self, source_img): 
  61.         ''
  62.         刪除 exif 信息后,返回剩余的 exif 信息 
  63.         ''
  64.         self.execute("-all=",source_img) 
  65.         metadata = self.get_metadata(source_img) 
  66.         return metadata[0] 

使用前先確保操作系統已經安裝了 exiftool,程序默認讀取兩個位置:

  1. /usr/bin/exiftool 
  2. /usr/local/bin/exiftool 

也可以自己傳入 exiftool 的執行路徑。

使用舉例:

  1. from pprint import pprint 
  2. if __name__ == '__main__'
  3.     with ExifTool() as e: 
  4.         exif = e.get_exif_info('/Users/aaron/Documents/個人/origin/文件1.jpg'
  5.         pprint(exif) 
  6.         exif = e.delete_exif_info('/Users/aaron/Documents/個人/origin/文件1.jpg'
  7.         print("========刪除 exif 信息后========"
  8.         pprint(exif) 

大家可以用 piexif 和我這里提供的 exif_tool 做個對比,看看哪個刪除的更徹底,有問題請留言討論。

4、拼接長圖

思路也簡單,也把要拼接的圖片放在數組里面,然后計算圖片的最大寬度作為拼接后圖片的寬度,然后一張一張拼接即可。

排版可以選擇靠左對齊,或者水平居中對齊,空白位置的顏色也可以自己定義。

具體代碼如下:

5、如何識別圖片上的文字

這其實就是 OCR 了,非常實用,不過個人很難訓練出優秀的模型,不如直接用大廠的 API。舉個例子,百度云的 AI 產品,你可以在終端下執行這樣一個命令來進行安裝。

  1. pip install baidu-aip 

在這里我使用了百度云提供的在線文字識別產品,提供了 AipOcr 函數實現用戶驗證、client.basicGeneral 函數實現文字識別功能。

代碼如下:

  1. from aip import AipOcr 
  2. """ 你的 APPID AK SK """ 
  3. APP_ID = '你的 App ID' 
  4. API_KEY = '你的 Api Key' 
  5. SECRET_KEY = '你的 Secret Key' 
  6. client = AipOcr(APP_ID, API_KEY, SECRET_KEY) 
  7. """ 讀取圖片 """ 
  8. def get_file_content(filePath): 
  9.     with open(filePath, 'rb'as fp: 
  10.         return fp.read() 
  11. image = get_file_content('example.png'
  12. """ 調用通用文字識別, 圖片參數為本地圖片 """ 
  13. result = client.basicGeneral(image) 
  14. print(result) 

在這段代碼里,實現了三個功能,分別是用戶驗證、讀取圖片和識別圖片。

為了更直觀地看到效果,我這里對著書拍個照片,然后讓它識別一下:

原圖如下:

識別結果如下:

6、給圖片加水印

添加自己的水印來防止別人盜圖,也可以宣傳品牌形象,如果要為大量圖片添加文字水印,不妨使用以下方法。

  1. from PIL import Image, ImageDraw, ImageFont 
  2.  
  3. def add_text_watermark(img, text): 
  4.     img = Image.open(img) 
  5.     draw = ImageDraw.Draw(img) 
  6.     myfont = ImageFont.truetype('/System/Library/Fonts/PingFang.ttc'size=100) 
  7.     fillcolor = "#ff0000" 
  8.     width, height = img.size 
  9.     draw.text((width - 700, height - 250), text, font=myfont, fill=fillcolor) 
  10.     return img 
  11.  
  12.  
  13. if __name__ == '__main__'
  14.     image = '/Users/aaron/Documents/個人/IMG_2288.compressed.jpg' 
  15.     img1 = add_text_watermark(image,'@Python七號'
  16.     img1.save("result_text_watermark.jpg","jpeg"

說明 draw.text((width - 700, height - 250), '@Python七號', font=myfont, fill=fillcolor)第一個括號填寫的是位置,左上角的坐標是 (0,0),右下角的坐標是(width,heigth),本例中 (width - 700, height - 250) 相當于是右下角。

效果如下(紅色部分是程序添加的):

那你可能又問下,如果加圖片水印呢?比如現在有一個 logo 想添加到圖片上,代碼如下:

  1. from PIL import Image 
  2. def add_img_watermark(img, img_watermark): 
  3.     rgba_image = Image.open(img).convert("RGBA"
  4.     rgba_watermark = Image.open(img_watermark).convert("RGBA"
  5.     image_x, image_y = rgba_image.size 
  6.     watermark_x, watermark_y = rgba_watermark.size 
  7.     # 縮放圖片 
  8.     scale = 10 
  9.     watermark_scale = max(image_x / (scale * watermark_x), image_y / (scale * watermark_y)) 
  10.     new_size = (int(watermark_x * watermark_scale), int(watermark_y * watermark_scale)) 
  11.     rgba_watermark = rgba_watermark.resize(new_size, resample=Image.ANTIALIAS) 
  12.     # 透明度 
  13.     rgba_watermark_mask = rgba_watermark.convert("L").point(lambda x: min(x, 180)) 
  14.     rgba_watermark.putalpha(rgba_watermark_mask) 
  15.  
  16.     watermark_x, watermark_y = rgba_watermark.size 
  17.     # 水印位置 
  18.     rgba_image.paste(rgba_watermark, ( (image_x - watermark_x)//2, image_y - watermark_y-100), rgba_watermark_mask)  # 右上角 
  19.  
  20.     return rgba_image.convert("RGB"
  21.  
  22. if __name__ == '__main__'
  23.     image = '/Users/aaron/Documents/個人/IMG_2288.compressed.jpg' 
  24.     img_watermark = "/Users/aaron/Downloads/IMG_2568.JPG" 
  25.     img2 = add_img_watermark(image, img_watermark) 
  26.     img2.save("result_img_watermark.jpg"

效果如下圖所示:

最后的話

圖片是我們接觸最多的媒體文件了,這里分享了 6 種關于圖片的實用操作,需要的可以直接復制這里的代碼使用。

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2022-03-21 10:09:08

PythonExcel郵件

2020-04-21 10:45:47

PythonWordExcel

2022-06-13 09:12:04

PythonPDF代碼

2025-04-23 08:15:00

2023-11-20 22:07:51

PythonPDF

2020-11-05 12:56:19

Python辦公自動化

2022-07-05 08:26:10

Python報表自動化郵箱

2024-10-28 19:36:05

2024-09-24 17:20:16

Python自動化辦公

2021-02-01 12:24:40

Python日志Expect

2024-05-29 11:16:33

PythonExcel

2022-08-04 13:27:35

Pythonopenpyxl

2009-07-16 17:06:23

Windows Emb

2021-06-02 09:12:04

App自動化測試測試自動化

2021-07-26 09:31:09

自動化測試編程語言手機編程

2017-12-17 21:58:18

2023-05-15 08:01:32

Python辦公自動化

2021-12-28 09:24:49

Python郵件Word

2024-09-25 10:00:00

Python自動化辦公

2014-09-22 11:24:18

運維
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文一区 | 午夜精品久久久久久久星辰影院 | 日韩一级| av片免费 | 日韩欧美一区二区三区四区 | av在线电影网 | 欧美一级二级三级视频 | 国产亚洲欧美另类一区二区三区 | 综合国产 | 国产精品久久久久久久久久 | 久久男人天堂 | 国产精品久久久久aaaa九色 | 精品久久久久久久人人人人传媒 | 欧美日韩福利视频 | 欧美va大片| 欧美一区视频 | 久久久久久久久淑女av国产精品 | 欧美日韩在线一区二区 | 亚洲高清av在线 | 成人在线观看中文字幕 | 在线免费观看成年人视频 | 精品久久久久久久久久久 | 久久精品亚洲精品国产欧美 | 成人亚洲综合 | 在线免费观看视频你懂的 | 亚洲一区二区三区免费 | 欧美日韩视频在线第一区 | аⅴ资源新版在线天堂 | 中文字幕一区二区三区精彩视频 | 欧美国产亚洲一区二区 | 日日网| 都市激情亚洲 | 国产成人精品久久 | 嫩草最新网址 | 久久久看| 日韩成人免费视频 | 精品国产乱码久久久久久88av | 国产精品久久久久久久久动漫 | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产偷录叫床高潮录音 | 资源首页二三区 |