python去除水印


去除原理

學過計算機的小伙伴們都知道 ,計算機中用 RGB 代表紅綠藍,用 (255, 0, 0) 表示紅色,(0, 255, 0) 表示綠色,
(0, 0, 255) 表示藍色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,
去水印的原理就是將水印的顏色變成白色(255, 255, 255)。
首先獲取圖片寬和高,用 itertools 模塊獲取寬和高的笛卡爾積作為像素點。
每個像素點的顏色都由 前三位的 RGB 和 第四位的 Alpha 通道構成。Alpha 通道不需要,只要 RGB 數據。

本文用到的庫文件

"""
安裝模塊
pillow
pymupdf
pymupdf 可以用 python 訪問擴展名為*.pdf、.xps、.oxps、.epub、.cbz或*.fb2的文件。
還支持了許多流行的圖像格式,包括多頁TIFF圖像。
"""

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

 

圖片去水印

首先需要通過微信圖片截取,確定水印顏色

 

 

 

def remove_img():
    """
    去除圖片水印
    :return:
    """
    # image_file = input("請輸入圖片地址:")
    image_file = "water.png"

    img = Image.open(image_file)
    width, height = img.size
    """
    product 用於求多個可迭代對象的笛卡爾積(Cartesian Product),它跟嵌套的 for 循環等價.即:
    product(A, B) 和 ((x,y) for x in A for y in B)的效果是一樣的。
    >>> A = [1, 2, 3]
    >>> B = [100, 200]
    >>> for item in product(A, B):
    ...     print(item)
    (1, 100)
    (1, 200)
    (2, 100)
    (2, 200)
    (3, 100)
    (3, 200)
    """
    for pos in product(range(width), range(height)):
        rgb = img.getpixel(pos)[:3]  # 得到圖片RGB
        """
        通過微信圖片截取
        可以看到水印的 RGB 是 (220, 220, 220),這里用 RGB 的和超過 660 就判定是水印點,此時將像素顏色替換為白色。最后保存圖片
        """
        if sum(rgb) >= 660:
            img.putpixel(pos, (255, 255, 255))

    img.save('eliminate_water.png')

 

pdf去水印

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

def remove_pdf():
    """
    PDF 去水印的原理和圖片去水印的原理大致相同,
    用 PyMuPDF 打開 pdf 文件后,將 pdf 的每一頁都轉換為圖片 pixmap,
    pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255) 最后保存為圖片。
    :return:
    """
    page_num = 0
    pdf_file = "water.pdf"
    # 用作提取pdf圖片
    pdf = fitz.open(pdf_file);
    # 獲得當前路徑
    cwd = os.getcwd()
    print(cwd)
    for page in pdf:
        rotate = int(0)
        # 每個尺寸的縮放系數為1.3,這將為我們生成分辨率提高2.6的圖像。
        # 此處若是不做設置,默認圖片大小為:792X612, dpi=72
        zoom_x = 2  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 2
        # 設置縮放和旋轉系數
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pixmap = page.getPixmap(matrix=mat, alpha=False)
        for pos in product(range(pixmap.width), range(pixmap.height)):
            rgb = pixmap.pixel(pos[0], pos[1])
            if sum(rgb) >= 660:
                pixmap.setPixel(pos[0], pos[1], (255, 255, 255))
        pixmap.writePNG(f"{cwd}/water_{page_num}.png")
        print(f"第{page_num}水印去除完成")
        page_num = page_num + 1

圖片轉 pdf

圖片轉 pdf 需要注意的是圖片的排序,
用 PyMuPDF 模塊打開圖片后將圖片用 convertToPDF() 函數轉成單頁的 pdf。插入到新的 pdf 文件中。

def pic_ConvertPdf():
    """
    圖片轉 pdf 需要注意的是圖片的排序,
    用 PyMuPDF 模塊打開圖片后將圖片用 convertToPDF() 函數轉成單頁的 pdf。插入到新的 pdf 文件中。
    :return:
    """
    pic_dir = os.getcwd()

    pdf = fitz.open()
    # pa = re.compile(r'([0-9]+).png')
    # 過濾符合的圖片文件
    list_files = [name for name in os.listdir(os.curdir) if fnmatch.fnmatchcase(name, "water_[0-9]*.png")]
    # 按數字排序
    img_files = sorted(list_files, key=lambda x:int((x.split('.')[0]).split('_')[1]), reverse=False)
    # print(img_files)

    for file in img_files:  # os.listdir返回指定的文件夾包含的文件或文件夾的名字的列表
        print(f"打開{file}開始轉換pdf")
        imgdoc = fitz.open(pic_dir + '/' + file)
        pdfbytes = imgdoc.convertToPDF()
        imgpdf = fitz.open("pdf", pdfbytes)
        pdf.insertPDF(imgpdf)
    pdf.save("eliminate_water.pdf")
    pdf.close()
    print(f"pdf水印去除完成,保存為eliminate_water.pdf")

到目前為止水印終於消除了。

可以有一個遺憾,通過此方式消除水印pdf的信息結構損壞了,不能復制文字了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM