1. 程式人生 > 其它 >黑科技程式設計開發,利用Python使圖片完美去除水印

黑科技程式設計開發,利用Python使圖片完美去除水印

網上下載的 pdf 學習資料有一些會帶有水印,非常影響閱讀。比如下面的圖片就是在 pdf 檔案上截取出來的。

安裝模組

乾貨主要有:

① 200 多本 Python 電子書(和經典的書籍)應該有

② Python標準庫資料(最全中文版)

③ 專案原始碼(四五十個有趣且可靠的練手專案及原始碼)

④ Python基礎入門、爬蟲、網路開發、大資料分析方面的視訊(適合小白學習)

⑤ Python學習路線圖(告別不入流的學習)

PIL:Python Imaging Library 是 python 上非常強大的影象處理標準庫,但是隻能支援 python 2.7,於是就有志願者在 PIL 的基礎上建立了支援 python 3的 pillow,並加入了一些新的特性。

pip install pillow

pymupdf 可以用 python 訪問副檔名為*.pdf、.xps、.oxps、.epub、.cbz或*.fb2的檔案。還支援了許多流行的影象格式,包括多頁TIFF影象。

pip install PyMuPDF

匯入需要用到的模組

from PIL import Image
from itertools import product
import fitz
import os

獲取圖片的 RGB

pdf 去水印的原理和圖片去水印的原理差不多,小編先從去除上面那張圖片的水印開始。

學過計算機的小夥伴們都知道 ,計算機中用 RGB 代表紅綠藍,用 (255, 0, 0) 表示紅色,(0, 255, 0) 表示綠色,(0, 0, 255) 表示藍色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,去水印的原理就是將水印的顏色變成白色(255, 255, 255)。

首先獲取圖片寬和高,用 itertools 模組獲取寬和高的笛卡爾積作為畫素點。每個畫素點的顏色都由 前三位的 RGB 和 第四位的 Alpha 通道構成。Alpha 通道不需要,只要 RGB 資料。

def remove_img():
    image_file = input("請輸入圖片地址:")

    img = Image.open(image_file)
    width, height = img.size

    for pos in product(range(width), range(height)):
        rgb = img.getpixel(pos)[:3]
        print(rgb)

圖片去水印

用微信截圖的方式檢視水印畫素點的 RGB。

可以看到水印的 RGB 是 (210, 210, 210),這裡用 RGB 的和超過 620 就判定是水印點,此時將畫素顏色替換為白色。最後儲存圖片。

rgb = img.getpixel(pos)[:3]
if(sum(rgb) >= 620):
    img.putpixel(pos, (255, 255, 255))

img.save('d:/qsy.png')

示例結果:

PDF 去水印

PDF 去水印的原理和圖片去水印的原理大致相同,用 PyMuPDF 開啟 pdf 檔案後,將 pdf 的每一頁都轉換為圖片 pixmap,pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255) 最後儲存為圖片。

def remove_pdf():
    page_num = 0
    pdf_file = input("請輸入 pdf 地址:")
    pdf = fitz.open(pdf_file);
    for page in pdf:
        pixmap = page.get_pixmap()
        for pos in product(range(pixmap.width), range(pixmap.height)):
            rgb = pixmap.pixel(pos[0], pos[1])
            if(sum(rgb) >= 620):
                pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
        pixmap.pil_save(f"d:/pdf_images/{page_num}.png")
        print(f"第{page_num}水印去除完成")
        page_num = page_num + 1

示例結果:

圖片轉為 pdf

圖片轉 pdf 需要注意的是圖片的排序,數字檔名必須先轉換為 int 型別後排序。用 PyMuPDF 模組開啟圖片後將圖片用 convertToPDF() 函式轉成單頁的 pdf。插入到新的 pdf 檔案中。

def pic2pdf():
    pic_dir = input("請輸入圖片資料夾路徑:")
    
    pdf = fitz.open()
    img_files = sorted(os.listdir(pic_dir),key=lambda x:int(str(x).split('.')[0]))
    for img in img_files:
        print(img)
        imgdoc = fitz.open(pic_dir + '/' + img)  
        pdfbytes = imgdoc.convertToPDF()   
        imgpdf = fitz.open("pdf", pdfbytes)
        pdf.insertPDF(imgpdf)       
    pdf.save("d:/demo.pdf")         
    pdf.close()

總結

pdf 和圖片上惱人的水印終於可以在強大的 python 面前消失了。小夥伴們學會了嗎?