99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀超簡單!為圖片和 PDF 上去掉水印(CDA干貨分享)
超簡單!為圖片和 PDF 上去掉水印(CDA干貨分享)
2022-01-17
收藏

作者:某某白米飯

來源:Python 技術(shù)

網(wǎng)上下載的 pdf 學(xué)習(xí)資料有一些會(huì)帶有水印,非常影響閱讀。比如下面的圖片就是在 pdf 文件上截取出來的。

超簡單!為圖片和 PDF 上去掉水印

安裝模塊

PIL:Python Imaging Library 是 python 上非常強(qiáng)大的圖像處理標(biāo)準(zhǔn)庫,但是只能支持 python 2.7,于是就有志愿者在 PIL 的基礎(chǔ)上創(chuàng)建了支持 python 3的 pillow,并加入了一些新的特性。

pip install pillow

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

pip install PyMuPDF

導(dǎo)入需要用到的模塊

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

獲取圖片的 RGB

pdf 去水印的原理和圖片去水印的原理差不多,小編先從去除上面那張圖片的水印開始。

學(xué)過計(jì)算機(jī)的小伙伴們都知道 ,計(jì)算機(jī)中用 RGB 代表紅綠藍(lán),用 (255, 0, 0) 表示紅色,(0, 255, 0) 表示綠色,(0, 0, 255) 表示藍(lán)色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,去水印的原理就是將水印的顏色變成白色(255, 255, 255)。

首先獲取圖片寬和高,用 itertools 模塊獲取寬和高的笛卡爾積作為像素點(diǎn)。每個(gè)像素點(diǎn)的顏色都由 前三位的 RGB 和 第四位的 Alpha 通道構(gòu)成。Alpha 通道不需要,只要 RGB 數(shù)據(jù)。

def remove_img(): image_file = input("請輸入圖片地址:") img = Image.open(image_file) width, height = img.size for pos in product(range(width), range(height)): rgb = img.getpixel(pos)[:3] print(rgb) 

圖片去水印

用微信截圖的方式查看水印像素點(diǎn)的 RGB。

超簡單!為圖片和 PDF 上去掉水印

可以看到水印的 RGB 是 (210, 210, 210),這里用 RGB 的和超過 620 就判定是水印點(diǎn),此時(shí)將像素顏色替換為白色。最后保存圖片。

rgb = img.getpixel(pos)[:3] if(sum(rgb) >= 620):
    img.putpixel(pos, (255, 255, 255))

img.save('d:/qsy.png')

示例結(jié)果:

超簡單!為圖片和 PDF 上去掉水印

PDF 去水印

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

def remove_pdf():
    page_num = 0 pdf_file = input("請輸入 pdf 地址:")
    pdf = fitz.open(pdf_file); for page in pdf:
        pixmap = page.get_pixmap() for pos in product(range(pixmap.width), range(pixmap.height)):
            rgb = pixmap.pixel(pos[0], pos[1]) if(sum(rgb) >= 620):
                pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
        pixmap.pil_save(f"d:/pdf_images/{page_num}.png") print(f"第{page_num}水印去除完成")
        page_num = page_num + 1 

示例結(jié)果:

超簡單!為圖片和 PDF 上去掉水印

圖片轉(zhuǎn)為 pdf

圖片轉(zhuǎn) pdf 需要注意的是圖片的排序,數(shù)字文件名必須先轉(zhuǎn)換為 int 類型后排序。用 PyMuPDF 模塊打開圖片后將圖片用 convertToPDF() 函數(shù)轉(zhuǎn)成單頁的 pdf。插入到新的 pdf 文件中。

def pic2pdf():
    pic_dir = input("請輸入圖片文件夾路徑:")
    
    pdf = fitz.open()
    img_files = sorted(os.listdir(pic_dir),key=lambda x:int(str(x).split('.')[0])) for img in img_files: print(img)
        imgdoc = fitz.open(pic_dir + '/' + img)  
        pdfbytes = imgdoc.convertToPDF()   
        imgpdf = fitz.open("pdf", pdfbytes)
        pdf.insertPDF(imgpdf)       
    pdf.save("d:/demo.pdf")         
    pdf.close()

總結(jié)

pdf 和圖片上惱人的水印終于可以在強(qiáng)大的 python 面前消失了。小伙伴們學(xué)會(huì)了嗎?

超簡單!為圖片和 PDF 上去掉水印

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }