黑科技编程开发,利用Python使图片完美去除水印

网上下载的 pdf 学习资料有一些会带有水印,非常影响阅读。比如下面的图片就是在 pdf 文件上截取出来的。

安装模块

干货主要有:

① 200 多本 Python 电子书(和经典的书籍)应该有
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且可靠的练手项目及源码)
④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)

黑科技编程开发,利用Python使图片完美去除水印

PIL:Python Imaging Library 是 python 上非常强大的图像处理标准库,但是只能支持 python 2.7,于是就有志愿者在 PIL 的基础上创建了支持 python 3的 pillow,并加入了一些新的特性。

<span class="hljs-attribute">pip install pillow</span>

pymupdf 可以用 python 访问扩展名为.pdf、.xps、.oxps、.epub、.cbz或.fb2的文件。还支持了许多流行的图像格式,包括多页TIFF图像。

<span class="hljs-attribute">pip install PyMuPDF</span>

导入需要用到的模块

from <span class="hljs-type">PIL <span class="hljs-keyword">import Image
from itertools <span class="hljs-keyword">import product
<span class="hljs-keyword">import fitz
<span class="hljs-keyword">import os</span></span></span></span></span>

获取图片的 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 数据。

<span class="hljs-attr">def <span class="hljs-string">remove_img():
    <span class="hljs-attr">image_file = <span class="hljs-string">input("&#x8BF7;&#x8F93;&#x5165;&#x56FE;&#x7247;&#x5730;&#x5740;&#xFF1A;")

    <span class="hljs-attr">img = <span class="hljs-string">Image.open(image_file)
    </span></span></span></span></span></span>

图片去水印

用微信截图的方式查看水印像素点的 RGB。

可以看到水印的 RGB 是 (210, 210, 210),这里用 RGB 的和超过 620 就判定是水印点,此时将像素颜色替换为白色。最后保存图片。

rgb = img.getpixel(<span class="hljs-keyword">pos)[:<span class="hljs-number">3]
<span class="hljs-keyword">if(sum(rgb) >= <span class="hljs-number">620):
    img.putpixel(<span class="hljs-keyword">pos, (<span class="hljs-number">255, <span class="hljs-number">255, <span class="hljs-number">255))

img.save(<span class="hljs-string">'d:/qsy.png')
</span></span></span></span></span></span></span></span></span>

示例结果:

PDF 去水印

PDF 去水印的原理和图片去水印的原理大致相同,用 PyMuPDF 打开 pdf 文件后,将 pdf 的每一页都转换为图片 pixmap,pixmap 有它自己的 RGB,只需要将 pdf 水印中的 RGB 改为(255, 255, 255) 最后保存为图片。

def remove_pdf():
    page_num = <span class="hljs-number">0
    pdf_file = input(<span class="hljs-string">"&#x8BF7;&#x8F93;&#x5165; pdf &#x5730;&#x5740;&#xFF1A;")
    pdf = fitz.open(pdf_file);
    <span class="hljs-keyword">for page in pdf:
        pixmap = page.get_pixmap()
        <span class="hljs-keyword">for <span class="hljs-keyword">pos in product(range(pixmap.width), range(pixmap.height)):
            rgb = pixmap.pixel(<span class="hljs-keyword">pos[<span class="hljs-number">0], <span class="hljs-keyword">pos[<span class="hljs-number">1])
            <span class="hljs-keyword">if(sum(rgb) >= <span class="hljs-number">620):
                pixmap.set_pixel(<span class="hljs-keyword">pos[<span class="hljs-number">0], <span class="hljs-keyword">pos[<span class="hljs-number">1], (<span class="hljs-number">255, <span class="hljs-number">255, <span class="hljs-number">255))
        pixmap.pil_save(f<span class="hljs-string">"d:/pdf_images/{page_num}.png")
        <span class="hljs-keyword">print(f<span class="hljs-string">"&#x7B2C;{page_num}&#x6C34;&#x5370;&#x53BB;&#x9664;&#x5B8C;&#x6210;")
        page_num = page_num + <span class="hljs-number">1
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

示例结果:

图片转为 pdf

图片转 pdf 需要注意的是图片的排序,数字文件名必须先转换为 int 类型后排序。用 PyMuPDF 模块打开图片后将图片用 convertToPDF() 函数转成单页的 pdf。插入到新的 pdf 文件中。

def pic2pdf():
    pic_dir = <span class="hljs-built_in">input(<span class="hljs-string">"&#x8BF7;&#x8F93;&#x5165;&#x56FE;&#x7247;&#x6587;&#x4EF6;&#x5939;&#x8DEF;&#x5F84;&#xFF1A;")

    pdf = fitz.<span class="hljs-built_in">open()
    img_files = sorted(<span class="hljs-built_in">os.listdir(pic_dir),key=lambda x:int(str(x).split(<span class="hljs-string">'.')[<span class="hljs-number">0]))
    <span class="hljs-keyword">for img <span class="hljs-keyword">in img_files:
        <span class="hljs-built_in">print(img)
        imgdoc = fitz.<span class="hljs-built_in">open(pic_dir + <span class="hljs-string">'/' + img)
        pdfbytes = imgdoc.convertToPDF()
        imgpdf = fitz.<span class="hljs-built_in">open(<span class="hljs-string">"pdf", pdfbytes)
        pdf.insertPDF(imgpdf)
    pdf.save(<span class="hljs-string">"d:/demo.pdf")
    pdf.<span class="hljs-built_in">close()
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

总结

pdf 和图片上恼人的水印终于可以在强大的 python 面前消失了。小伙伴们学会了吗?

Original: https://www.cnblogs.com/sn5200/p/15883571.html
Author: Python可乐的呀
Title: 黑科技编程开发,利用Python使图片完美去除水印

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814996/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球