首页 > 编程语言 >手把手教你用 Python 去除图片和 PDF 水印

手把手教你用 Python 去除图片和 PDF 水印

时间:2024-01-06 10:32:45浏览次数:40  
标签:Python 教你用 pos 水印 RGB pdf PDF png 255

我们在平时的学习,工作和写作中,有时会遇到一些需要将图片的水印去除的场景。

虽然网络上有很多免费或者付费的软件可以帮助我们去除图片水印,但作为程序员,我们完全可以自己动手编程实现。

原理分析

假设我们需要将下面这张图片里的水印,使用 Python 代码去除。

在这里插入图片描述

图像是由像素组成的,每个像素代表图像中的一个小点,具有特定的颜色值。这些颜色值通常由红(R)、绿(G)、蓝(B)三个通道组成,有时还包括透明度通道(Alpha)。图像处理就是通过操作这些像素的颜色值来实现对图像的各种变换和效果。

我们首先使用微信聊天窗口里的快捷键 Alt+A 查看上图,发现白色背景色的 RGB 为 (255,255,255):

在这里插入图片描述

黑色字体的 RGB 值为 (148,148,148)

在这里插入图片描述

水印区域的 RGB 值为 (221,221,221):

在这里插入图片描述

通过仔细观察,我们发现,水印 RGB 之和与白色背景色的 RGB 之和比较接近,而与黑色字体的 RGB 之和有较大差异。

那么图片区水印的思路不就有了吗?遍历图片每一个像素,提取出其 RGB 值,将 RGB 三位值之和,与一个阈值进行比较,如果大于这个阈值,说明该像素对应的区域是水印,于是将这个像素的 RGB 值设置为白色背景色,也就是 (255,255,255) 即可。

那么这个阈值应该取多少合适呢?显然,黑色字体的 RGB 和(1483=444)必须小于这个阈值,而白色背景色 RGB 之和(2553=765)必须大于这个阈值。所以我们可以把阈值定为 600,尝试一下效果如何。

下面开始编写 Python 代码。

笔者开发了这段 Python 代码:

from itertools import product
from PIL import Image

img = Image.open('input.png')
width, height = img.size
for pos in product(range(width), range(height)):
    if sum(img.getpixel(pos)[:3]) > 600:
        img.putpixel(pos, (255,255,255))
img.save('output.png')

上述代码执行之后,在当前文件夹下,自动生成了一个去除水印之后的 output.png 文件,内容如下:

在这里插入图片描述

可以看到,水印已经成功被移除了。

详细介绍代码的含义:

  1. from itertools import product: 这一行导入了 Python itertools模块中的product函数。product函数用于生成多个可迭代对象的笛卡尔积,这些笛卡尔积后续用于遍历图片的每个像素点的坐标。

  2. from PIL import Image: 这一行导入了PIL库中的Image模块,用于处理图像。Image 模块提供了 getpixel 和 putpixel 方法,可以读取和设置像素值。

  3. img = Image.open('input.png'): 打开名为'input.png'的图片文件,并将其赋值给变量img。这个变量作为句柄,后续用于操作和处理图片。

  4. width, height = img.size: 获取图片的宽度和高度,并分别赋值给变量widthheight

  5. for pos in product(range(width), range(height)):: 使用product函数遍历图片的每个像素点的坐标。这里pos表示当前像素点的坐标,是一个包含两个元素的元组。

  6. if sum(img.getpixel(pos)[:3]) > 600:: 获取当前像素点的RGB值,使用getpixel方法,然后取前三个元素(即R、G、B通道),将它们相加。如果总和大于阈值600,说明该像素被判定为水印。

  7. img.putpixel(pos, (255, 255, 255)): 将当前像素点的颜色设置为白色(255, 255, 255),这就是去除水印的操作。

  8. img.save('output.png'): 将修改后的图片保存为'output.png'。

PDF 文件中的水印去除

有了图片去水印的基础之后,去除 PDF 文件的水印也就不再无从下手了。写作这篇文章的时候,我回忆起了高中数学老师对我们的谆谆教诲:高中数学解题技巧,就是一个不断的将陌生问题转化成熟悉问题的过程。

我们首先将 PDF 文件的内容,转换成图片,然后对图片进行去水印操作,这是我们熟悉的内容。将去除水印后的图片,重新保存成 PDF 文件即可。

我们用来测试的包含水印的 PDF 文件如下:

在这里插入图片描述

代码如下,将其另存为 2.py:

from itertools import product
import fitz

pdf = fitz.open("1.pdf");
page = pdf[0];
pixmap = page.get_pixmap()
for pos in product(range(pixmap.width), range(pixmap.height)):
    rgb = pixmap.pixel(pos[0], pos[1])
    if(sum(rgb) >= 600):
        pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
pixmap.pil_save("2.png")
print("水印去除完成")

这里我们使用了 PyMuPDF 库,所以需要使用 pip install PyMuPDF 首先安装。

在这里插入图片描述

使用命令行 python 2.py 执行之后,会在当前文件夹下生成一个去除完水印的图片文件 2.png .

这段代码的功能是打开名为“1.pdf”的PDF文件,获取其第一页的位图表示,然后遍历每个像素点,检查其是否代表水印。如果是,则将该像素点的颜色设置为白色。最后,将修改后的位图保存为PNG格式的图像文件“2.png”,并输出提示信息“水印去除完成”。

有了 2.png 文件之后,我们再使用 Python PyMuPDF 的 convert_to_pdf 方法,将 png 文件重新转换成 PDF 文件即可。

代码如下:

import fitz
pdf = fitz.open()
imgdoc = fitz.open("2.png")  
pdfbytes = imgdoc.conver_to_pdf()    
imgpdf = fitz.open("pdf", pdfbytes)
pdf.insert_pdf(imgpdf)        
pdf.save("3.pdf")          
pdf.close()

执行上述 Python 代码之后,在当前文件夹下生成了一个名为 3.pdf 的文件,打开如下图所示,可见水印已经被删除了:

在这里插入图片描述

标签:Python,教你用,pos,水印,RGB,pdf,PDF,png,255
From: https://blog.51cto.com/jerrywangsap/9125700

相关文章

  • python-数据解析-bs4介绍
    一、数据解析方式-bs41、 爬虫数据的解析常用方式有三种: 1、正则表达式2、bs43、xpath解析2、本次主要学习bs4,首先要先准备好环境,即要安装使用beautifulSoup,这里已经安装好了bs4模块,如下:pipinstallbs4和pipinstalllxml 3、通过一个实例理解bs......
  • python第一节:简介、下载、安装​
    第一节:简介、下载、安装简介:Python的创造者吉多·范罗苏姆。Python是一款易于学习、跨平台语言、免费和开源、的编程语言。有丰富的第三方模块库,应用领域非常广泛。常用于数据采集、数据分析和计算、数据挖掘、人工智能等。下载:下载地址:https://www.python.org/安装:先选中下面两......
  • Python 通过 akshare 绘制中国平安均线并显示买卖点
    继续上篇,通过akshare绘制中国平台的均线,并在5日线上穿10日线的时候,显示买入信号,在5日线下穿10日均线的时候,显示卖出信号环境:python3.9(miniconda3)、Pycharm、Win10需要用的模块或者工具库:akshare(1.11.91)、pandas(2.1.1)、numpy(1.26.2)、matplotlib(3.8.2)、mplfinanc......
  • Python笔记三之闭包与装饰器
    本文首发于公众号:Hunter后端原文链接:Python笔记三之闭包与装饰器这一篇笔记介绍Python里面的装饰器。在介绍装饰器前,首先提出这样一个需求,我想统计某个函数的执行时间,假设这个函数如下:importtimedefadd(x,y):time.sleep(1)returnx+y想要统计add函数......
  • 使用 Python 进行简单的人脸识别
    介绍人脸识别技术已经成为当今世界许多领域的重要应用,从安全领域到社交媒体,无处不在。Python提供了许多强大的库和工具,使得实现人脸识别变得更加容易。本文将介绍如何使用Python中的一些流行库来进行简单的人脸识别。准备工作在开始之前,确保你已经安装了以下库:OpenCV:用于......
  • python人脸识别
    应用范围广泛安全与监控:人脸识别在安防领域中具有显著的应用,可用于识别入侵者或追踪犯罪嫌疑人。社交媒体和相册组织:社交媒体平台和相册应用可以利用人脸识别来自动标记照片中的人物,方便用户组织和查找照片。医疗保健:人脸识别技术在医疗保健中用于患者身份验证和监测,例如识别......
  • Python Pandas 数据清洗
    ​ 1、处理缺失数据处理缺失数据是数据清洗过程的一个重要部分。缺失数据可以以多种方式出现,最常见的是作为NaN(NotaNumber)。处理缺失数据涉及使用 isna() 或 isnull() 检测缺失值,fillna() 填充缺失值,dropna() 删除包含缺失值的行或列,以及 interpolate() 对缺失值进......
  • python-bs4获取图片
    一、用一个实例来了解一下 1、既然要用BeautifulSoup来解析,首先要把需要的模块导入;importosimportrequestsfrombs4importBeautifulSoup2、创建一个文件夹来存放要下载的数据:文件的名可以用户自定义file_name="imgs"ifnotos.path.exists(file_name......
  • 【Python入门教程】读取图片信息最全教程(经纬度、偏转角、无人机影像、大疆)
    ​    通常读取图片的属性信息(如经纬度、拍摄时间、IMU数据等)都是通过exifread库进行读取,但是有些图片用这个库读取的效果不好。所以今天我就和大家分享一下如何使用Python读取图片属性信息的三种方法。1GDAL读取    GDAL库是用来处理卫星影像的库,它同样可......
  • 【Python&RS】栅格数据/图片位深度(bit)转换
    ​    关于栅格数据/图片的位深度(eg.8bit、16bit、32bit)转换之前我就发过一篇文章,【Python&RS】基于GDAL栅格数据/图片位深度(bit)转换。但是最近在使用的时候发现好像效果不行,有时候转换不成功,所以自己又研究了一下原理重新写了一份代码。今天就和大家分享一下如何使用Py......