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.pswp.cn/news/533724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533724.shtml
英文地址,請注明出處:http://en.pswp.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…

html loader使用方法,webpack中loader的使用方法,以及幾個常用loader的應用小實例

loader&#xff1a;是webpack用來預處理模塊的&#xff0c;在一個模塊被引入之前&#xff0c;會預先使用loader處理模塊的內容。可能&#xff0c;你會遇到當你用webpack打包的時候&#xff0c;提示你需要一個loader來處理文件&#xff0c;那webpack中的loader就是幫助預處理下模…

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;沒有之一。所以這是重點也是難點&…

南通大學計算機組成原理期末考試題,南通大學計算機組成原理期末考試范圍.docx...

南通大學計算機組成原理期末考試范圍計算機組成原理選擇填空題 15分填空題 20 分計算題 50分設計題 15分第一章計算機的主要性能指標馮諾依曼型計算機的體系結構、組成部分控制器的基本任務計算機系統的層次結構第二章數據與文字的表示方法定點數的表示方法數的機器碼表示校驗碼…

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…

認識計算機網絡試講稿,操作系統簡介試講教案.pdf

學習必備 歡迎下載課題 操作系統簡介內容章節&#xff1a;第二章第一節 課型&#xff1a;新授課教學時間: 本節內容共授課2課時 授課班級:學習者分析&#xff1a;學生通過第一章的學習&#xff0c;對計算機的軟、硬件知識有了初步的了解&#xff0c;。但由于學生普遍對計算機理…

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;電腦才能夠回到菜單界面當中…