亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

如何用canvas實(shí)現(xiàn)在線簽名的示例代碼

2024-08-26 00:20:50
字體:
供稿:網(wǎng)友

隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,在線簽名技術(shù)越來越多的被應(yīng)用在無紙化辦公中,這種直觀便利的操作不僅可以大幅提升辦公效率,而且使用數(shù)字化存儲(chǔ)方式,避開了傳統(tǒng)的紙質(zhì)簽字存儲(chǔ)查閱困難等問題。在我們?cè)谌粘I钪?,已?jīng)有很多場(chǎng)景使用在線簽名技術(shù),例如:pos機(jī)刷卡簽字、快遞簽收簽字、銀行或機(jī)關(guān)單位業(yè)務(wù)辦理簽字等。最近在做公司的業(yè)務(wù)辦理需求,里面也涉及到在線簽名,我們采用的 Canvas 技術(shù)實(shí)現(xiàn),接下來,讓我們來聊聊如何使用 Canvas 實(shí)現(xiàn)在線簽名吧!

什么是 Canvas?

Canvas 是 HTML5 新增的元素,用于在網(wǎng)頁上繪制圖形,它由 Apple 在 Safari 1.3 Web 瀏覽器中引入,之所以對(duì) HTML 擴(kuò)展的原因在于, HTML 在 Safari 中的繪圖能力能為 Mac OS X 桌面的 Dashboard 組件所使用,并且 Apple 也希望有一種方式可以在 Dashboard 中支持腳本化的圖形。Firefox 1.5 和 Opera 9 這兩個(gè)瀏覽器也緊隨 Safari 的引領(lǐng),開始支持 Canvas 。

現(xiàn)在,Canvas 標(biāo)簽已經(jīng)是 HTML5 最偉大的改進(jìn)之一,因?yàn)樗梢宰屛覀冊(cè)诓皇褂脠D片的情況下實(shí)現(xiàn)網(wǎng)頁的圖形設(shè)計(jì)。它就像一塊畫布,本身沒有繪制能力,但卻把繪制 API 展現(xiàn)給客戶端 JavaScript,我們借助 JavaScript 的支持,在畫布范圍內(nèi)盡情發(fā)揮,達(dá)到想要的效果。

技術(shù)選型

這個(gè)功能無論是 Canvas、SVG 或是 Flash,都可以實(shí)現(xiàn),但是我們?yōu)槭裁催x擇了 Canvas 呢?

首先,由于功能上我們需要支持移動(dòng)平臺(tái),所以 Flash 我們就可以直接棄掉,它在移動(dòng)端方面并沒有得到友好的支持,但 Canvas 和 SVG 都具有很好的跨平臺(tái)能力,我們?nèi)绾尉駬?,下面我們來?duì)比一下。

  •  Canvas 基于像素,提供 2D 繪制函數(shù),提供的功能更原始,適合像素處理、動(dòng)態(tài)渲染和大數(shù)據(jù)量繪制,可控性高,繪制完了基本不記錄過程,繪圖性能會(huì)更好一點(diǎn),各大廠商也早都實(shí)現(xiàn)了canvas的硬件加速機(jī)制。  
  • SVG 為矢量,提供一系列圖形元素,功能更完善,建立了一大堆可交互對(duì)象,本性長(zhǎng)于交互,但性能會(huì)弱些,更適合靜態(tài)圖片展示,高保真文檔查看和打印的應(yīng)用場(chǎng)景。

兩者各有自己的擅長(zhǎng)領(lǐng)域, 基于以上,我們選擇了 Canvas 來實(shí)現(xiàn)簽字功能。

下面,我們來看一下實(shí)現(xiàn)效果。

canvas,在線簽名,代碼

了解了 Canvas 來源、技術(shù)選型和最終呈現(xiàn)效果,接下來、我們會(huì)從創(chuàng)建、繪制、監(jiān)聽、重繪、圖片處理等五部分進(jìn)行撰寫,讓我們一起走進(jìn) Canvas 繪制的世界。

創(chuàng)建畫布

首先,我們需要判斷瀏覽器是否支持 Canvas :

isCanvasSupported = (): boolean => {    let elem = document.createElement('canvas');    return !!(elem.getContext && elem.getContext('2d'));}

然后根據(jù)判斷結(jié)果選擇創(chuàng)建 Canvas 畫布還是展示提示

{isCanvasSupported ?     <canvas ref={canvas => (this.canvas = canvas)} height={canvasHeight} width={canvasWidth}>    :對(duì)不起,當(dāng)前瀏覽器暫不支持此功能!}

我們知道,每個(gè) Canvas 節(jié)點(diǎn)都有一個(gè)對(duì)應(yīng)的 context 對(duì)象, 我們可以通過 Canvas 對(duì)象的 getContext() 方法,直接把量字符串 “2d” 作為唯一的參數(shù)傳遞給它來獲取。接下來,我們通過 ref 獲取 Canvas 元素,再通過 getContext() 方法得到一個(gè)畫布上繪圖的環(huán)境。

let cxt = this.canvas.getContext('2d');this.setState({cxt: cxt});

環(huán)境已經(jīng)準(zhǔn)備妥當(dāng),接下來我們就開始進(jìn)行繪制工作吧!

繪制

首先繪制開始路徑:

cxt.beginPath();

然后設(shè)置當(dāng)前線條的寬度:

cxt.lineWidth = 5;

設(shè)置線條的顏色:

cxt.strokeStyle = '#000';

通過 moveTo 和 lineTo ,我們來繪制一條線

cxt.moveTo(0,0);cxt.lineTo(150,0);// 繪制已定義的路徑cxt.stroke()

canvas,在線簽名,代碼

但是,我們發(fā)現(xiàn)繪制的線條比較生硬

這時(shí),我們可以通過 lineCap 改變線條末端線帽的樣式,為每個(gè)末端添加圓形線帽,減少線條的生硬感

cxt.lineCap = 'round';

canvas,在線簽名,代碼

同時(shí),我們還可以通過設(shè)置 lineJoin,指定條線交匯時(shí)為圓形邊角

cxt.lineJoin = 'round';

canvas,在線簽名,代碼 canvas,在線簽名,代碼

但我們又發(fā)現(xiàn),繪制的線條有明顯的鋸齒,此時(shí)我們就需要借助 Canvas 為我們提供的繪制元素陰影的功能來模糊邊緣出現(xiàn)的鋸齒,因?yàn)橛嘘幱?,所以我們可以適當(dāng)改變 lineWidth 值

cxt.shadowBlur = 1;cxt.shadowColor = '#000';

canvas,在線簽名,代碼

是不是變得圓潤(rùn)很多,到這里,我們繪制線路的方法已經(jīng)準(zhǔn)備完事,接下來我們來看一下怎么監(jiān)聽畫布事件來實(shí)現(xiàn)連貫執(zhí)行繪制吧!

監(jiān)聽畫布事件

因?yàn)槲覀冃枰瑫r(shí)兼容 PC 端和移動(dòng)端,所以我們需要事先需要判斷一下對(duì)應(yīng)執(zhí)行的事件

this.state = {events: ('ontouchstart' in window) ? ['touchstart', 'touchmove', 'touchend'] : ['mousedown', 'mousemove', 'mouseup']}

在畫布初始化之后,我們開始監(jiān)聽 events[0] 事件

this.canvas.addEventListener(this.events[0], startEventHandler, false);

在startEventHandler函數(shù)中監(jiān)聽 events[1] 和 events[2] 事件

this.canvas.addEventListener(events[1], moveEventHandler, false);this.canvas.addEventListener(events[2], endEventHandler, false);

重點(diǎn)來了,我們核心的內(nèi)容就是計(jì)算、描繪劃過的路徑

moveEventHandler(event: any): void {    event.preventDefault();    const {ctx, isSupportTouch} = this.state;    const evt = isSupportTouch ? event.touches[0] : event;    const coverPos = this.canvas.getBoundingClientRect();    const mouseX = evt.clientX - coverPos.left;    const mouseY = evt.clientY - coverPos.top;    cxt.lineTo(       mouseX,       mouseY    );    cxt.stroke();}

了解 Canvas 的知道, Canvas 畫布為我們提供了一個(gè)用來作圖的平面空間,該空間的每個(gè)點(diǎn)都有自己的坐標(biāo),x 表示橫坐標(biāo),y 表示豎坐標(biāo)。原點(diǎn) (0, 0) 位于圖像左上角,x 軸的正向是原點(diǎn)向右,y 軸的正向是原點(diǎn)向下。

于是我們通過 getBoundingClientRect() 方法獲得頁面 Canvas 元素相對(duì)瀏覽器視窗的位置左邊和頂部的像素距離,再利用 clientX,clientY 事件屬性返回當(dāng)事件被觸發(fā)時(shí)鼠標(biāo)指針向?qū)τ跒g覽器頁面的水平和垂直坐標(biāo),最后通過 lineTo 和 stroke 來繪制路徑。

同時(shí),我們要記得在 events[2] 事件執(zhí)行之后,移除 events[1]、events[2] 事件,否則會(huì)造成一直繪制。

endEventHandler(event: any): void {    event.preventDefault();    const {events, moveEventHandler, endEventHandler} = this.state;    this.canvas.removeEventListener(events[1], moveEventHandler, false);    this.canvas.removeEventListener(events[2], endEventHandler, false);}

如此反復(fù)循環(huán)上述事件操作,我們的簽字功能就基本實(shí)現(xiàn)了。

重新繪制

簽字過程中,簽錯(cuò)或是簽的過于潦草是必不可免的,所以我們需要支持清空簽字的功能,這時(shí),我們利用 Canvas 的 clearRect() 方法就可以幫助我們清除畫布區(qū)域內(nèi)容。

cxt.clearRect(0, 0, canvasWidth, canvasHeight);

圖片處理

繪制之后我們還沒完事,我們還需要把繪制的簽名上傳保存。這時(shí),我們可以利用 toDataURL() 方法將 Canvas 轉(zhuǎn)化成一般的圖像文件形式。

通常我們直接執(zhí)行以操作就能轉(zhuǎn)化成 data URI,然后再利用 ajax 請(qǐng)求上傳就完事了。

dataurl = this.canvas.toDataURL('image/png');//ordataurl = this.canvas.toDataURL('image/jpeg', 0.8);

但是,由于各種業(yè)務(wù)需求,我們有時(shí)需要攜帶頁面其他內(nèi)容,這時(shí),我們可以借助 html2canvas 來實(shí)現(xiàn)。html2canvas 可以幫助我們對(duì)瀏覽器端整個(gè)或部分頁面進(jìn)行截屏,并渲染成一個(gè) Canvas ,然后我們?cè)诶?toDataURL() 方法進(jìn)行處理。

說道 html2canvas,順便給大家一個(gè)繞坑提示,它在一些低版本瀏覽器截出來的圖片是空白的,原因是使用了flex 布局,而html2canvas并不支持 -webkit-flex 或 -webkit-box,所以無法將 HTML 生成 Canvas,從而導(dǎo)致了截出一張白屏。

解決辦法:

  • 不使用flex布局
  • 修改 html2canvas 源碼,在html2canvas/dist/npm/parsing/display.js 文件中增加 -webkit-flex 和 -webkit-box 也返回 DISPLAY.FLEX; 小結(jié)

通過以上幾步,我們就基本實(shí)現(xiàn)了在線簽名的功能。值得注意的是,這個(gè)項(xiàng)目我們使用的 React+TypeScript 環(huán)境構(gòu)建,上述代碼的實(shí)際使用需要結(jié)合自己環(huán)境進(jìn)行適當(dāng)修改。

文中使用的是 Canvas 比較淺層的繪制知識(shí),如果想利用Canvas進(jìn)動(dòng)畫制作、物理效果模擬、碰撞檢測(cè)、游戲開發(fā)、移動(dòng)應(yīng)用開發(fā)、大數(shù)據(jù)可視化開發(fā),還需要我們復(fù)習(xí)一下之前學(xué)過的數(shù)學(xué)幾何、物理方面的知識(shí),然后在慢慢摸索?,F(xiàn)在很多成熟的圖表插件都是用 Canvas 實(shí)現(xiàn)的,例如 Chart.js、ECharts等,里面很多好看炫酷的圖表,幾乎覆蓋了所有圖表的實(shí)現(xiàn)。Canvas還有很多開源類庫,例如 ZRender、createJS、Pixi.js等,ECharts底層也是依賴輕量級(jí)的 Canvas 類庫 ZRender 進(jìn)行封裝的。

好了,我們今天就先聊到這里,如有任何疑問,還請(qǐng)留言。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。 


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
蜜臀av免费观看| 中文字幕在线观看二区| 中文字幕在线永久在线视频2020| 91免费国产网站| 亚洲视频一区在线播放| 国产女人18毛片水18精品| 91社在线播放| 高潮无码精品色欲av午夜福利| 97超级碰碰碰久久久| 在线丨暗呦小u女国产精品| 亚洲国产高清视频| 56国语精品自产拍在线观看| 久久美女艺术照精彩视频福利播放| 午夜av在线免费观看| 女人喷潮完整视频| 久久精品一区二区三区不卡牛牛| 国产91精品久久久久久久网曝门| 一二三区中文字幕| 无码人妻一区二区三区在线| 亚洲色图视频免费播放| 免费在线观看一区二区三区| 成人午夜视频精品一区| 成人免费毛片嘿嘿连载视频| 六月亚洲精品一区| 91沈先生在线观看| 久久无码人妻一区二区三区| 国产精品suv一区二区三区| 国内外成人在线视频| 色大师av一区二区三区| 麻豆tv入口在线看| 日韩理论片网站| 日本高清色图| 青青草视频在线免费直播| 国产调教视频在线观看| 女人被狂躁到高潮视频免费网站| 爽爽视频在线观看| 综合另类专区| 国产69精品久久久久999小说| 蜜臀av.com| 成人激情文学综合网| 色一区二区三区四区| 久久青青草原亚洲av无码麻豆| 一区二区美女视频| 伊人影院综合在线| 一区二区中文字幕| 日本三级免费看| 丰满爆乳一区二区三区| 影音先锋男人资源站在线观看| 日韩中文字幕高清在线观看| 亚洲午夜精品久久久久久app| 鲁大师私人影院在线观看| 欧美xxxx性xxxxx高清视频| 亚洲综合在线网站| 777色狠狠一区二区三区| 最新中文字幕在线观看视频| 日韩亚洲成人av在线| 美女毛片一区二区三区四区| 欧美三区免费完整视频在线观看| 一本色道久久综合亚洲精品酒店| 中文字幕日本乱码精品影院| 日本黄色免费在线观看| 欧美最猛黑人猛交69| 精品国产污污免费网站入口| 精品国产丝袜高跟鞋| 久久久久99精品成人片我成大片| 97理论电影| 日韩欧美中文第一页| 九九九在线观看视频| 久久久久久久久久久黄色| 少妇激情一区二区三区| 亚洲精品久久久成人| 国产九色porn网址| 精品中文字幕人| 夜夜骑天天操| 国产欧美久久久久| 意大利激情丛林无删减版dvd| 18禁免费无码无遮挡不卡网站| 丰满岳乱妇一区二区| 亚洲一区二区免费视频软件合集| 亚洲国产精品国自产拍久久| 久久精品xxxxx| 国产精品第八页| 久久久久久久国产| 欧美人与禽猛交乱配视频| 91久久精品网| a91a精品视频在线观看| 国产精品a久久久久久| 精品免费国产一区二区| 亚洲综合一区二区不卡| 成年人影院在线观看| 操人视频在线播放| 国产又大又粗又爽的毛片| 青青草av在线播放| 日韩精选视频| 国产精品美女无圣光视频| 91久久精品美女| 国产精品美女av| 欧美美乳视频| 亚洲欧美一区二区三| 欧美日韩不卡一区| 欧美在线免费播放| 久久99欧美| 图片一区二区| 亚洲伦理一区二区三区| 久久精品99国产国产精| 无码av免费精品一区二区三区| 日韩精品免费一区二区三区竹菊| av日韩一区二区三区| 一二三四视频免费观看在线看| 亚洲一区二区三区午夜| 国产成人激情小视频| 首页国产欧美日韩丝袜| 欧美黑粗硬大| 四虎网站在线观看| 在线观看视频二区| 一道本在线视频| 一级网站在线观看| 国产成人高清精品免费5388| 黄色在线观看视频网站| 日本在线免费中文字幕| 亚洲第一视频在线播放| 中文字幕第21页| 亚洲欧美另类在线视频| 亚洲国产三级在线| 亚洲一区二区三区四区在线免费观看| 99久久久免费精品国产一区二区| 老司机精品视频在线| 天天躁日日躁狠狠躁喷水| 亚洲一区网站| 亚洲特色特黄| 天天精品视频| 免费看岛国视频在线观看| 成人网址大全| 亚洲级视频在线观看免费1级| 国产精品无码AV| 色综合视频一区二区三区日韩| 亚洲精品成人无限看| 成人在线视频一区二区三区| 国产成人一区二区在线| 日本又骚又刺激的视频在线观看| 国语对白做受69| 日韩中文字幕在线免费| 波多野结衣电影免费观看| 免费观看羞羞视频网站| 麻豆一区二区三区四区精品蜜桃| 黄色网在线视频| 中文天堂av| 久久福利小视频| 日韩video| 欧美日韩播放| 99热播在线观看| 精彩视频一区二区| 最新国产成人av网站网址麻豆| 亚洲观看黄色网| 欧洲一区二区在线| 永久免费毛片在线观看| 一本大道香蕉久在线播放29| 日本在线观看视频网站| 精品国产一区二区三区在线| 一级精品视频在线观看宜春院| 国产精品视频久久一区| 麻豆亚洲av熟女国产一区二| 日韩亚洲一区中文字幕| 日韩中文字幕电影| 欧美变态tickling挠脚心| 免费看一级大黄情大片| 可以免费观看av的网站| 国产在线观看免费播放| 亚洲欧美另类色图| а天堂中文在线官网| 91麻豆国产福利在线观看| 免费h视频在线观看| 久久天天东北熟女毛茸茸| 91精品国产综合久久精品性色| 欧美一区二区三区爽大粗免费| 女同一区二区| 免费人成网ww777kkk手机| 午夜视频一区在线观看| 猫咪av网站| 亚洲精品中文字幕无码蜜桃| 91超碰在线免费| 国产午夜福利视频在线观看| 亚洲大尺度网站| 91欧美一区二区| 99这里只有精品视频| 毛片激情在线观看| 91视频免费看片| 一区二区不卡视频| 99re热这里只有精品视频| 18视频在线观看娇喘| 欧美色精品在线视频| 欧洲成人综合网| 成r视频免费观看在线播放| 欧美男人的天堂一二区| av一区在线| 久久久视频免费观看| 91精品国产色综合久久不8| 国产伦理精品| 桥本有菜亚洲精品av在线| 日韩精品卡通动漫网站| 蜜桃91精品入口| 青青草视频在线免费播放| 最近日本中文字幕| 亚洲人成网7777777国产| 久久精品国产亚洲精品2020| 国产精品av免费在线观看| 亚洲日本激情| 欧美日韩国产欧美日美国产精品| 美女高潮在线观看| 亚洲欧美99| 一区二区三区四区精品| 亚洲欧美日韩中文字幕一区二区三区| 亚洲高清成人影院| 色婷婷精品国产一区二区三区| 亚洲精品久久久久久宅男| 激情视频亚洲| av噜噜色噜噜久久| 在线观看一区二区视频| 最新av中文字幕| 国产精品久久无码一三区| 婷婷综合六月| 日本高清不卡免费| 激情小说图片视频| 三级黄色免费观看| 亚洲一区影音先锋| 亚洲精品久久嫩草网站秘色| 人妻一区二区三区四区| 欧美精品一线| 国产成人免费精品| 国产香蕉在线| 这里视频有精品| 天堂av免费在线| 国产成人久久精品麻豆二区| 精品国产一区二区三区久久久蜜月| 色偷偷色偷偷色偷偷在线视频| 成人精品一二区| 国产成人免费观看视频| 日本www在线视频| 精品一区二区三区自拍图片区| 天天做天天爱天天高潮| 999国产精品999久久久久久| 动漫精品一区二区| 天堂网www在线网| 日韩大片在线播放| 无码无套少妇毛多18pxxxx| av免费在线播放网站| 国产九色91| 国产福利电影一区二区三区| 欧美国产日韩a欧美在线观看| 欧美精品激情视频| 伊人久久成人网| 国产激情一区二区三区四区| 日本中文字幕免费| 国产极品视频在线观看| 久久一区二区三区av| 日韩成人影音| √资源天堂中文在线| 日韩黄色av网站| 欧美激情亚洲综合| 女同性一区二区三区人了人一| 欧美激情久久久久久久久久久| 97碰碰碰免费色视频| 国产区高清在线| 美女100%无挡| 久久久久久99| 久久这里有精品| 手机av在线免费| 99热这里只有精品9| 欧美日韩激情在线| 插插插亚洲综合网| 97av自拍| 欧美黑人xxxx| 国产精品污网站| 亚洲在线国产日韩欧美| 九九热免费精品视频| 久久最新免费视频| 久草在线资源福利站| 国产免费999| 国产一级黄色av| 成人动漫av| 成人免费观看在线视频| 91精品国产综合久久久久久丝袜| 精品入口麻豆88视频| 飘雪影院手机免费高清版在线观看| 在线视频国产福利| 日本二三区不卡| 136av视频导航| 免费网站www在线观看| 久久久无码一区二区三区| 男人的天堂免费| 国产黄视频在线观看| 在线成人免费网站| 欧美人与性动xxxx| 亚洲综合网av| 一级特黄aaa大片在线观看| 亚洲欧美另类综合| 成人免费在线电影| 亚洲美女电影在线| 亚洲精品中文字幕乱码三区91| 亚洲成人av在线播放| 国产精品高潮呻吟久久av黑人| 正在播放亚洲精品| 亚洲一区日韩精品| 4hu最新网址| 日韩一本大道| 中文字幕在线永久在线视频| 亚洲国产精品网站| 国产偷人视频免费| 亚洲久久在线| 欧美男男青年gay1069videost| 国产精品美女一区二区在线观看| 国产精品国产a| 中文字幕高清在线播放| 激情se五月| 国产香蕉精品| 麻豆成人在线观看| 欧美一区二区麻豆红桃视频| 欧美特黄一级视频| 亚洲综合色区另类av| 国产高清在线观看视频| 中文字幕在线免费播放| 肥女人的一级毛片| 欧美人与禽性xxxxx杂性| bbw丰满大肥奶肥婆| 青娱乐国产精品视频| 日本不卡一区二区三区| 国产精品久久久久久影视| 极品销魂美女一区二区三区|