html自动给图片加上水印 代码_如何给一千张图片去水印?还好我会python,100行代码轻松搞定...

362c7dc809bf2b6eb16350e0f0904357.gif

写在前面

近期好多网友私信我,问我编程该怎么学习、怎么入门。我觉得编程学习,就像写文章一样,需要积累。

如果把代码每个字符拆开,大伙都认识,但是组合在一起,就是另外一回事了。所以我的建议是,学习编程,从项目入手,从自己感兴趣的项目入手,遇到不懂的语法、算法,就去翻阅书、看视频。

如果一开始就去看生硬的语法、晦涩的算法,就像背单词一样,背到第一个单词abandon,就放弃了。

废话不多说,直接上项目,这次是一个批量去除水印的项目。

  • 环境配置:

python版本: 3.6.0

编辑器: pycharm

ps: 每一步都有代码和排版截图,方便学习

  • 代码目录结构

37e5f790341ac91522b357b0f323f5ee.png

切记刚开始学习的时候,目录结构保持和源码一致

第一步:导入相关的python包

# encoding:utf-8
import os
from PIL import Image
import numpy as np
import imghdr

python包的作用:

os: 本项目只用到了对文件、文件夹的操作。

PIL: Python Imaging Library,是Python平台的图像处理标准库。PIL功能非常强大,API也非常简单易用。安装命令:pip install pillow

numpy: (Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。安装命令: pip install numpy

imghdr: 是一个用来检测图片类型的模块,传递给它的可以是一个文件对象,也可以是一个字节流。

72c63fbdec0ab56460000d2901364357.png

第二步:参数配置类

class CONF:input_path = "input_img"    # 待处理的图片存放的位置output_path = "output_img"  # 去除水印后的图片存放位置level_black = 108    # 用于去除水印的特征值level_white = 170    # 用于去除水印的特征值is_log = True        # 是否打印日志信息

这里是个人编程的习惯,我习惯把一些配置,例如:文件路径、模型存放路径、模型参数统一放在一个类中。当然,实际项目开发的时候,是用config 文本文件存放,不会直接写在代码里,这里为了演示方便,就写在一起,也方便运行。这块代码放在代码文件的开头也方便查看和修改。

3c3d0eda7bb10332198194be3a728008.png

第三步:类的初始化

class DocWipe:def __init__(self, input_path, output_path, level_black, level_white, is_log):self.input_path = input_pathself.output_path = output_pathself.level_black = level_blackself.level_white = level_whiteself.is_log = is_log""" 初始化 """@classmethoddef initialize(cls, config):input_path = config.input_pathoutput_path = config.output_pathlevel_black = config.level_blacklevel_white = config.level_whiteis_log = config.is_logreturn cls(input_path, output_path, level_black, level_white, is_log)

initialize() 函数和 __init__() 函数 是对象初始化和实例化,其中包括基本参数的赋值、最后返回用户一个对象。这里作为一个类的基本操作,是属于一个通用模板,在大多数项目中,都可以这么去写。为了养成良好的编程习惯,大家可以把这个模板记下来,后续直接套用,修改部分参数就可以了。

02ef40a3f18fc734aa0060cd3631437a.png

第四步: 类的主流程函数

""" 主流程 """
def wipe_process(self,):if os.path.exists(self.input_path) and os.path.isdir(self.output_path):self.visit_dir_files(self.input_path, self.output_path, self.input_path)if self.is_log:print(u'完成!所有图片已保存至路径' + self.output_path)else:print(u'待处理的图片存放的位置 %s, 如果没有请新建目录 %s' % (self.input_path, self.input_path))print(u'去除水印后的图片存放位置 %s, 如果没有请新建目录 %s' % (self.output_path, self.output_path))

在写代码的时候,一定要抓住主线,就是代码运行的主流程。因为一个完整可靠的项目,它是有很多细枝末节考虑,很多步骤是要分模块来写。主流程就是把主心干确定好,各个模块的入口确定好。这样开发的时候,思路会比较清晰,不会被细节吸引住。这里主心干只有个函数 visit_dir_files() 的调用,但是它的外围都是一些边界条件的判定,不重要,但是没有它们程序会出现BUG。

3c829af6239c162a9bf21b882888083e.png

第五步:图像处理算法

""" 图片处理 """
def img_deal(self, img_path, save_path):img = Image.open(img_path)img = self.levels_deal(img, self.level_black, self.level_white)img_res = Image.fromarray(img.astype('uint8'))if self.is_log:print(u'图片[' + img_path + u']处理完毕')img_res.save(save_path)""" 图像矩阵处理 """
def levels_deal(self, img, black, white):if white > 255:white = 255if black < 0:black = 0if black >= white:black = white - 2img_array = np.array(img, dtype=int)c_rate = -(white - black) / 255.0 * 0.05rgb_diff = np.maximum(img_array - black, 0)img_array = np.around(rgb_diff * c_rate, 0)img_array = img_array.astype(int)return img_array

在计算机看来,彩色图片是三个二维数据分别是R通道、G通道、B通道,而灰度图是一个二维数组。数值类型是uint8,简单的说,就是每个像素点是0~255的数值。去除水印的算法,其实就是对每个像素点进行运算,为了加快运算速度和代码的整洁度,使用了numpy包的矩阵运算。

这块的细节理解起来是比较有难度的,它涉及了图像处理的算法,这块可以先跳过,知道它的功能是干嘛的就行。后续有时间,再来细细琢磨。

a7a68aba0c78df8502c0493f5eab37b9.png
  • 第六步: 递归访问文件
""" 创建文件夹 """
def mkdir(self, path):path = path.strip().rstrip("")is_exists = os.path.exists(path)if not is_exists:os.makedirs(path)return Trueelse:return False""" 递归访问文件/文件夹 """
def visit_dir_files(self, org_input_dir, org_output_dir, recursion_dir):single_file = Falseif os.path.isdir(recursion_dir):dir_list = os.listdir(recursion_dir)else:dir_list = [recursion_dir]single_file = Truefor i in range(0, len(dir_list)):path = os.path.join(recursion_dir, dir_list[i])if os.path.isdir(path):self.visit_dir_files(org_input_dir, org_output_dir, path)else:if imghdr.what(path):abs_output_dir = org_output_dir + recursion_dir[len(org_input_dir):]target_path = os.path.join(abs_output_dir, dir_list[i])if single_file:target_path = os.path.join(org_output_dir, os.path.basename(dir_list[i]))target_dir_name = os.path.dirname(target_path)if not os.path.exists(target_dir_name):self.mkdir(target_dir_name)self.img_deal(path, target_path)

这里也有一个难点,递归访问文件/文件夹。递归,就是自己调用自己。可以把它当成“分治法”,打个比方,如果你想解决一个很大的难题,直接计算是非常困难的,可以把它拆解成多个小问题,一个一个来解决。而递归,就是起到一个“分治”的作用。它调用的过程,就是数据结构里面的“”(先进后出)。

我当时开始学习算法的时候,递归算法也是研究了一个星期才懂它的原理。所以大家学习的时候,不要着急,先在纸上模拟调用过程,慢慢就会懂了。

21206e45b31821d5c6af07aa568e1d2e.png

第七步: 主函数入口

if __name__ == '__main__':# 对象初始化doc_wipe = DocWipe.initialize(config=CONF)# 调用主流程doc_wipe.wipe_process()

至此,加上一个main函数去调用,所有程序的入口。我们终于完成了。

b8df04d6fcce318525339157946008f1.png

最后,测试一下

用我之前写的《最近很火的文章自动生成器》,来生成随机一篇文章,并加上水印。再转成图片,作为程序的输入,运行结果:

213407636a287509c0610cdedc1b36ed.png

左边有水印,右边是经过python去除了水印

注意: 仅对浅色的黑白/彩色水印有效,如WPS水印,课程水印等

最后,给一点点学习建议,不懂的时候,先弄明白它的功能以及会使用它,让代码先运行起来。等有时间就一个一个细节去攻破它,编程和写文章一样,需要慢慢积累,加油。

原文链接https://www.toutiao.com/a6810654859126112772/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html中两个图片叠放,CSS实现图片叠放(勾选图标)

场景我们经常会遇到这种场景&#xff0c;有一个待选图片列表&#xff0c;在图片上(可能是右上角也有可能时右下角)叠放一个勾选状态图标&#xff0c;这篇文章就记录实现这个功能的过程。原理利用flex布局space-around显示图片列表在图片的外层加一个div&#xff0c;同时把勾选状…

pyspark sparksession_PySpark 处理数据和数据建模

安装相关包from pyspark.sql import SparkSession from pyspark.sql.functions import udf, when, count, countDistinct from pyspark.sql.types import IntegerType,StringType from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler from…

linq查询不包含某个值的记录_MySQL行(记录)的详细操作

阅读目录一 介绍二 插入数据INSERT三 更新数据UPDATE四 删除数据DELETE五 查询数据SELECT六 权限管理一 介绍MySQL数据操作&#xff1a; DML在MySQL管理软件中&#xff0c;可以通过SQL语句中的DML语言来实现数据的操作&#xff0c;包括使用INSERT实现数据的插入UPDATE实现数据的…

听课评课记录计算机应用,教师听课的评语(精选10篇)

教师听课的评语(精选10篇)通过引导学生提炼信息提出问题解决问题&#xff0c;使学生再次感受了数学与现实生活的密切联系&#xff0c;经历了运用乘法口诀求商的计算方法的形成过程&#xff0c;培养了学生对知识的迁移能力。下面是小编整理的教师听课的评语(精选10篇)&#xff0…

java音频实时传输_会议室智能系统建设方案,实时远程视频协作

2019年&#xff0c;预计会议协作需求将持续增长&#xff0c;创建多功能会议室促进本地、异地协作仍然是一个强大的趋势。无论空间大小或距离远近&#xff0c;政府部门、企业单位以及团体组织为了实现决策指令畅通、管理层次分明&#xff0c;需要通过对会议室环境、多功能会议系…

依赖 netty spring_十分钟带你了解Spring的七大知识点,程序员必了解

Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。很多研发人员把spring看作心目中最好的java项目&#xff0c;没有之一。所以这是重点也是难点&…

android实现手机拍照以及图片预览功能_手机系统将有A/B分区?Android 11这些变化你关注过吗...

跳票让Android 11沉淀下来并吸引了更多的消费者&#xff0c;在iPhone SE大规模进军主流消费市场的今天&#xff0c;Android这边难道不想依靠新系统扳回一局吗&#xff1f;在人们感叹iOS一些功能似曾相似的时候&#xff0c;Android 11新的突破与创新格外让人振奋。01Android 11欲…

小程序的点赞功能能和浏览次数功能_扫码点餐小程序好用吗?小程序还能实现哪些功能?...

有不少的餐厅现在都可以用小程序扫码点餐了&#xff0c;为什么现在很少用公众号点餐了&#xff1f;原因其实很简单&#xff0c;用公众号点餐用户还要关注公众号&#xff0c;第二个就是在于公众号每天发消息很烦&#xff0c;而小程序则没有这样的烦恼&#xff0c;只在使用的时候…

word计算机课教学反思,《WORD》初中信息技术的教学反思

《WORD》初中信息技术的教学反思本节课在建构主义学习理论指导下&#xff0c;采用“任务驱动”教学策略&#xff0c;借助多媒体课件&#xff0c;对学生实施研究式自主学习教学模式&#xff0c;教学中注重培养学生分析问题、解决问题的能力。通过学习和实际操作&#xff0c;培养…

simulink中mask设置_(实现BPSK学习Verilog)1. Simulink仿真实现

欢迎关注BUG记录知乎专栏和BUG记录公众号&#xff0c;关注BUG记录公众号回复101获取本文使用的Simulink仿真文件微信号&#xff1a;BugRec由于最近研究某个高速接口没什么实质性的突破&#xff0c;实在写不出太好的东西&#xff0c;所以就写点更为基础的东西分享给大家&#xf…

arima模型_[不说人话系列]-ARIMA模型

看文献的时候看到几个统计推理的模型&#xff0c;想要大概了解&#xff0c;想做个系列&#xff0c;记录自己胡说八道的数理笔记过程。如有错误&#xff0c;感谢您指正。文前感谢冯小姐详细认真的技术援助&#xff01;1- 名称简称&#xff1a;ARIMA模型英文名&#xff1a;Auto r…

pcb天线和纯铜天线_如何简化天线设计?相控阵波束成形IC来助您

为提高性能&#xff0c;无线通信和雷达系统对天线架构的需求不断增长。只有那些功耗低于传统机械操纵碟形天线的天线才能实现许多新的应用。除了这些要求以外&#xff0c;还需要针对新的威胁或新的用户快速重新定位&#xff0c;传输多个数据流&#xff0c;并以超低的成本……正…

c语言贪吃蛇_C语言贪吃蛇完整代码

#include #include #include //windows编程头文件#include #include //控制台输入输出头文件#ifndef __cplusplustypedef char bool;#define false 0#define true 1#endif//将光标移动到控制台的(x,y)坐标点处void gotoxy(int x, int y){COORD coord;coord.X x;coord.Y y;Se…

上海市计算机一级客观题,2012年上海市高校计算机等级考试(一级)模拟卷客观题...

2012年上海市高校计算机等级考试(一级)模拟卷客观题 (5页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.9 积分关于防火墙&#xff0c;以下说法不正确的是____A____。下列属于视频制作的常用软件的…

百度云盘云知梦php_教你搭建私有云盘,简单快速,完全傻瓜式!不限速,永久有效!...

免费的云盘服务有很多&#xff0c;但是总感觉把重要文件存在上面不安全&#xff0c;动不动就跑路或者限速。辛辛苦苦收集的学习资料&#xff0c;一夜直接可能就会付诸东流。最稳妥的方式是存放在本地硬盘中&#xff0c;但是要进行共享或者不同设备之间进行交换&#xff0c;就显…

结束 txt进程_Python多进程抓取拉钩网十万数据

转载&#xff1a;Python多进程抓取拉钩网十万数据准备安装Mongodb数据库其实不是一定要使用MongoDB&#xff0c;大家完全可以使用MySQL或者Redis&#xff0c;全看大家喜好。这篇文章我们的例子是Mongodb&#xff0c;所以大家需要下载它。在Windows中。由于MongoDB默认的数据目录…

计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...

电脑是目前人们生活、工作中使用最多的电子产品之一&#xff0c;我们都经常会使用到电脑。但是如果电脑在一段时间后不使用&#xff0c;电脑就会自动进入休眠状态&#xff0c;而在进入休眠状态的之后&#xff0c;只有当我们将电脑唤醒了&#xff0c;电脑才能够回到菜单界面当中…

python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例

一、前言qq music上的音乐还是不少的&#xff0c;有些时候想要下载好听的音乐&#xff0c;但有每次在网页下载都是烦人的登录什么的。于是&#xff0c;来了个qqmusic的爬虫。至少我觉得for循环爬虫&#xff0c;最核心的应该就是找到待爬元素所在url吧。二、Python爬取QQ音乐单曲…

python类定义的讲解_python面向对象、自定义类等使用实例讲解

python 面向对象相对别的语言来说缺少两个功能&#xff1a; 1、python不具备重载&#xff0c;重载是指在同一个类中&#xff0c;使得方法有相同的名称&#xff0c;但是有不同的参数列表&#xff0c;但由于python函数具有强大的参数处理功能&#xff0c;因此这不是一个问题。 2、…

ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau

Ubuntu初始化脚本,安装显卡驱动专用初始化脚本替换apt源为国内清华源,增加docker-ce国内源开启tab键补齐桌面版开启ssh仅支持Ubuntu16/18桌面版安装gcc make屏蔽nouveau 自动重启服务器生效#!/bin/bash #检测网络是否通畅 ping -w 5 qq.com || { echo "网络异常,脚本终止&…