每天網上的博客各個領域都會涌現新文章,有時候看到感興趣的知識就想把某段文字 copy下來 摘錄下來,等有時間后慢慢品味
在部分網站上,如果只是復制少量文字,并沒有什么不同。但是當我們復制的文字多的話會發現多了一個小尾巴
所謂小尾巴是指在復制文本的最后會多一個作者和出處信息,如下:
···(復制的內容)···
————————————————
版權聲明:本文為xxx的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://www.cnblogs.com/rainy-night/
博客園可能并沒有這種情況,但是在很多技術論壇、博客都有這樣的處理。當我們復制文章內容的時候,往往會自動加上一段文本信息版權
那么如果我們也想實現這樣的效果要怎么做呢?
前提:假定所選擇的字符串長度大于等于130時帶上版權信息
<div id="copy">
<div>示例一:這不是一個 bug,這只是一個未列出來的特性。</div>
<div>
示例二:ES6 是一個泛指,含義是 5.1 版以后的 JavaScript。
ES6 是 JavaScript 語言的下一代標準,已經在 2015 年 6 月正式發布了。
它的目標,是使得 JavaScript 語言可以用來編寫復雜的大型應用程序,使之成為企業級開發語言。
</div>
</div>
<script>
var copyEl = document.getElementById('copy');
copyEl.oncopy = function (e) {
if (window.getSelection(0).toString().length >= 130) {
var clipboardData = event.clipboardData || window.clipboardData;
// 阻止默認事件
e.preventDefault();
var copyMsg =
window.getSelection() +
'\r\n————————————————\r\n版權聲明:本文為xxx的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。' +
'\r\n原文鏈接:' + location.href;
// 將處理完的信息添加到剪切板
clipboardData.setData('Text', copyMsg);
// 將處理完的信息添加到剪切板
clipboardData.setData('Text', copyMsg);
}
};
</script>
演示
瀏覽器兼容性
當復制示例一后可以發現粘貼是正常的;復制示例二則會在末尾攜帶版權信息
我們直接復制代碼,會發現當字數超過一定值時也是會攜帶版權信息。但是點擊“復制代碼”的時候可以一鍵復制區域內的代碼,這可以怎么實現呢?
<div>
<pre>
<code id="copyable">// 浮點數相加
function mathMultiply(arg1, arg2) {
var m = 0;
var s1 = arg1.toString();
var s2 = arg2.toString();
try {
m += s1.split('.')[1].length; // 小數相乘,小數點后個數相加
} catch (e) {}
try {
m += s2.split('.')[1].length;
} catch (e) {}
return (
(Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) /
Math.pow(10, m)
);
}<code />
</pre>
<button id="btn">復制代碼</button>
</div>
<script>
var btn = document.getElementById('btn');
btn.onclick = function copyCode() {
window.getSelection().removeAllRanges(); // 清除選中的文本
var range = document.createRange();
range.selectNode(document.getElementById('copyable'));
var selection = window.getSelection();
selection.addRange(range); // 添加選中的內容
document.execCommand('copy'); // 執行復制
window.getSelection().removeAllRanges(); // 清除復制選中的文本
alert('代碼復制成功');
};
</script>
演示
瀏覽器兼容性
document.execCommand()因為安全問題已經廢棄,不適合長期使用
除了以上實現方式,也可以使用第三方庫封裝好的函數來實現
文章來自https://www.cnblogs.com/rainy-night/p/16132466.html
者:悅然wordpress建站(悅然建站)
繼續分享wordpress建站教程,今天教大家給網站的原創文章添加版權信息,能夠在一定程度上降低網站內容被采集的影響。
?這里給大家分享3種方法,大家可以根據自己的實際需求選擇使用。
wordpress建站使用的主題模板下都存在一個文件——single.php,這個文件就是用來控制文章內容顯示的,所以我們需要打開single.php文件,可以在寶塔面板中編輯,或者是通過FTP下載這個文件,然后用記事本編輯。
<?php the_content(); ?>
找到上面這行代碼。
<script type="text/javascript">
document.body.oncopy=function(){
event.returnValue=false;
var t=document.selection.createRange().text;
var s="本文來源于<?php bloginfo('name'); ?> <?php echo get_settings('home'); ?> , 原文地址: <?php the_permalink() ?> ";
clipboardData.setData('Text','\r\n'+t+'\r\n'+s+'\r\n');
}
</script>
然后復制上面這段代碼,按它添加到剛才的代碼下方,最后保存。上面代碼中的中文說明可以自行修改。
這段代碼實現的效果是:當用戶復制或采集您的企業網站內容時,會自動把文章的版本信息復制下來。
wordpress也有很多實現版權說明的插件,下面給大家分享的插件為——wp-display-copyright-master,這個插件有點老的,但功能正常,使用也比較簡單。
插件下載地址
鏈接: https://pan.baidu.com/s/1Bce-dKJhnQATk90aVSnH2g 提取碼: ps48
安裝好之后直接啟用就可以了。
?如果你不滿足插件默認的版本提示內容,你也可以在插件設置中修改,如上圖所示,參考上面的說明調整就可以了。
不管是使用代碼還是插件,默認情況下都會給全站的文章都添加版權說明。如果你的企業網站內容全部都是原創的,這樣做沒有問題,但如果你的企業網站內容也是轉載的,那這樣做就不是太好,亂用版權申明也可能存在一些隱患哦。
所以我們也可以嘗試手動添加版權說明,方法就是自己打字,在你的個別原創文章的開頭或結尾添加一段版權說明文字就可以了,這個方法適用于所有網站建設程序,比如你的企業網站建設使用的是H5模板建站系統、或者是DEDECMS、帝國CMS等可以。
如果你使用的是wordpress的古騰堡編輯器,那么也可以配合它的可重用區塊使用,這樣可以在需要添加版權的直接調用,操作方法如下:
1.先編輯好網站版權申明的內容。
wordpress建站教程:古騰堡可重用區塊的使用
2.然后添加上面的可重用區塊教程操作就可以了。
小結:以上幾種方法大家根據實際情況使用即可,用不上的也沒必要強行使用了。大家可以觀察悅然wordpress建站官網,雖然我的網站內容基本都是原創,但是我并沒有添加版權說明。剛開始的時間我也遇到了一些惡心的抄襲者,但隨著網站收錄的提高,搜索引擎基本都可以識別出原創出處的,也就是說那些抄襲者對我基本沒太多影響。所以做好內容才是最重要的哦。
以上就是今天給大家分享的wordpress建站教程,希望對您有用。?
注:部分代碼參考作者 skyblue NG 博客修改,部分代碼在新的版本不適用,所以作了修改,在3.7上可以正常運行。)
上節談到如何通過自動查找邊緣,獲取文檔輪廓來進行透視轉換的問題,在圖像文件比較清晰的情況下,這個轉換還是很簡單的,但是也存在先天的缺陷,就是實際應用所獲得的圖像并不是那么好獲取文檔輪廓,所以我們得另辟蹊徑來解決這個問題,方法就是通過人工鼠標選取需要轉換的區域來實現。這樣可以適用于大多數情況。
整體的思路是這樣的:
第一步:需要用到tkinter圖形界面,構建一個GUI用于圖像導入等操作
第二步:定義鼠標事件,對導入的圖像選取ROI區域,這里通過鼠標標注ROI的四個角點坐標
第三步:調用上一節使用到的transform and scan 程序,把scan程序修改成一個函數
第四步:顯示結果
看起來也不是很難,當然你得對tkinter有所了解,不過參照文檔理解這些代碼不難,而且我做了大量的注釋,盡量減少代碼理解的難度。關鍵是一定要自己動手驗證一下。
馬上進入第一步:構建一個GUI窗體
# -*- coding: utf-8 -*- from tkinter import * from tkinter.filedialog import askopenfilename #需要用到文件對話框 import cv2 import numpy as np from tkinter import ttk import win32clipboard as wcld import os from scan_module import wrapped root = Tk() # 創建根窗體 frm1 = Frame(root) # 把frm1加載到根窗體中 frm1.pack(side='top',anchor='e',ipadx=1,ipady=1) # 放置frm1框架的為止 frm2 = Frame(root) # 加載第二個框架到根窗體 frm2.pack(side='top',anchor='w',ipadx=1,ipady=3) root.title("ROI截取") Label(frm1,text="ROI截取 第一版",fg ="gray").pack(side="right") # 在框架1中加載一個標簽 ttk.Button(frm2,text="打開文件",command=myopen).pack(side="left",ipadx=8) # 在框架2左邊加載一個按鈕并賦予按鈕事件 ttk.Label(frm2,text=" 坐標:").pack(side="left",ipadx=0) # 在框架2左邊再加載一個標簽 msg = StringVar() ttk.Entry(frm2,width=60, textvariable = msg).pack(side="left",ipadx=0) # 緊接著在框架2左邊再加載一個文本輸入框 ttk.Button(frm2,text="復制",command=send_to_clibboard).pack(side="right",ipadx=3) # 在框架2右邊加載一個按鈕并賦予按鈕事件 # 進入消息循環 root.mainloop() # tkinter一般只有執行mainloop()方法才能運行,才能創建窗口
構建完是這個樣子的:
第二步:定義按鈕 ‘打開文件’ 事件,myopen() 函數
filename = "" def myopen(): global filename,img,ROI # 通過askopenfilename()方法直接獲取文檔名稱 filename = askopenfilename(filetypes=(("Template files", "*.tplate"), ("HTML files", "*.html;*.htm"), ("All files", "*.*") )) print (filename) img = cv2.imread(filename) ROI = img.copy() # setMouseCallback()創建了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再抬起的過程,都會分3次調用鼠標響應函數 # 這里調用的回調函數就是上面定義的on_mouse()函數,當鼠標激活打開的圖像時,執行相應的操作。 cv2.namedWindow('src') cv2.setMouseCallback('src', on_mouse) cv2.imshow('src', img) cv2.waitKey(0) cv2.destroyAllWindows() 定義on_mouse() 函數: # -----------------------鼠標操作相關------------------------------------------ lsPointsChoose = [] #選取點的坐標列表 tpPointsChoose = [] pointsCount = 0 #鼠標點擊的次數 count = 0 pointsMax = 4 #初始化選取點的數量 def on_mouse(event, x, y, flags, param): global img, point1, point2, count, pointsMax global lsPointsChoose, tpPointsChoose # 存入選擇的點 global pointsCount # 對鼠標按下的點計數 global img2, ROI_bymouse_flag img2 = img.copy() # 此行代碼保證每次都重新再原圖畫 避免畫多了 if event == cv2.EVENT_LBUTTONDOWN: # 左鍵點擊 pointsCount = pointsCount + 1 print('pointsCount:', pointsCount) point1 = (x, y) print (x, y) # 畫出點擊的點 cv2.circle(img2, point1, 10, (0, 255, 0), 2) # 將選取的點保存到list列表里 lsPointsChoose.append([x, y]) # 用于轉化為array 提取多邊形ROI tpPointsChoose.append((x, y)) # 用于畫點 # ---------------------------------------------------------------------- # 將鼠標選的點用直線連起來 print(len(tpPointsChoose)) for i in range(len(tpPointsChoose) - 1): print('i', i) cv2.line(img2, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 2) # ----------點擊到pointMax時可以提取去繪圖---------------- if (pointsCount == pointsMax): # -----------繪制感興趣區域----------- cv2.line(img2, tpPointsChoose[0], tpPointsChoose[pointsMax-1], (0, 0, 255), 2) # 把多邊形封閉,最后一個點和起始點連接 ROI_byMouse() # 調用繪制函數畫出感興趣區域 ROI_bymouse_flag = 1 i = 0 pointsCount = 0 tpPointsChoose = [] lsPointsChoose = [] cv2.imshow('src', img2) # -------------------------右鍵按下清除軌跡----------------------------- if event == cv2.EVENT_RBUTTONDOWN: # 右鍵點擊 print("right-mouse") pointsCount = 0 tpPointsChoose = [] lsPointsChoose = [] cv2.imshow('src', img2) 再定義ROI_byMouse()函數 def ROI_byMouse(): global src, ROI, ROI_flag, mask2, lsPointsChoose, msg mask = np.zeros(img.shape, np.uint8) #print(lsPointsChoose) msg.set(lsPointsChoose)# 儲存選擇點坐標的列表到msg變量 #print(msg.get()) pts = np.array([lsPointsChoose], np.int32) # pts是多邊形的頂點列表(頂點集) pts = pts.reshape((-1, 1, 2)) #print(pts) # 這里 reshape 的第一個參數為-1, 表明這一維的長度是根據后面的維度的計算出來的。 # OpenCV中需要先將多邊形的頂點坐標變成頂點數×1×2維的矩陣,再來繪制 # --------------畫多邊形--------------------- #mask = cv2.polylines(mask, [pts], True, (255, 255, 255)) # -------------填充多邊形--------------------- mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255)) #cv2.imshow('mask', mask2) cv2.imwrite('mask.bmp', mask2) ROI = cv2.bitwise_and(mask2, img) wrap_img = wrapped(ROI) cv2.imwrite('ROI.bmp', ROI) cv2.imshow('ROI', ROI) cv2.imshow('wrap_image',wrap_img)
本例中還定義了一個 send_to_clibboard() 復制到剪切板函數用于查看選取的四個角點的坐標,主要用來驗證效果,其實可以不用。不過你可以參考。
def send_to_clibboard(): wcld.OpenClipboard() wcld.EmptyClipboard() wcld.SetClipboardData(wcld.CF_UNICODETEXT, msg.get()) # 此處使用.CF_UNICODETEXT方法才能正常解析 wcld.CloseClipboard()
把上一篇的scan.py修改成scan_module()模塊用來調用:
# 導入必要的庫 #導入上一節構建的模塊和函數 from transform import four_point_transform #記得安裝scikit-image包,threshold-local函數幫助我們處理黑白圖像 from skimage.filters import threshold_local import numpy as np import argparse import cv2 #imutils是一個很實用的圖像處理庫,比如resize/cropping/rotate等圖像基本編輯 import imutils #這個module直接返回轉換后的圖像,用于其它程序調用 def wrapped(image): # 第一步 # 加載圖像并計算新舊圖像高度的比例,并拷貝一份,修改大小。 # 為了加快圖像處理速度,同時使邊緣檢測步驟更加準確, # 我們將掃描圖像的高度調整為500像素。 # 我們還特別注意跟蹤圖像的原始高度與新高度的比值, # 這將允許我們對原始圖像而不是調整大小的圖像執行掃描。 #img = cv2.imread(image) img = image ratio = img.shape[0] / 500.0 orig = img.copy() img = imutils.resize(img, height = 500) # 把圖象轉化為灰度, 并加模糊處理,然后查找邊緣 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) edged = cv2.Canny(gray, 70, 250) # 顯示原始圖像和檢測到的邊緣圖像,不需要顯示 #print("STEP 1: Edge Detection") #cv2.imshow("Image", img) #cv2.imshow("Edged", edged) #cv2.waitKey(0) #cv2.destroyAllWindows() # 第二步 # 在邊緣圖像的基礎上查找輪廓保留最大的一個,并在圖像中標識出來 cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5] # 循環處理 for c in cnts: # 大致輪廓 peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) # 如果查找的大致輪廓有四個角點,即假設為我們需要查找的 if len(approx) == 4: screenCnt = approx break # 顯示文檔的輪廓在這個模塊中不需要顯示 #print("STEP 2: Find contours of paper") #cv2.drawContours(img, [screenCnt], -1, (0, 255, 0), 2) #cv2.imshow("Outline", img) #cv2.waitKey(0) #cv2.destroyAllWindows() # 第三步 # 應用四點轉換生成鳥瞰圖 warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio) # 把變形的圖像轉化成灰度 warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) T = threshold_local(warped, 11, offset = 10, method = "gaussian") warped = (warped > T).astype("uint8") * 255 return warped
該函數返回轉換后的圖像。
好了,我們測試一下效果
查看一下視頻,演示測試過程:
效果非常好。趕緊動起手來,設計一個屬于自己的文檔掃描儀吧。下一次嘗試一下OCR,文本識別和輸出。這個比較有挑戰。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。