基于 HTML5 Canvas 實(shí)現(xiàn)圖片旋轉(zhuǎn)與下載功能(完整代碼展示)

一、引言
在 Web 開發(fā)中,經(jīng)常會(huì)遇到需要對(duì)圖片進(jìn)行處理并提供下載功能的需求。本文將深入剖析一段基于 HTML5 Canvas 的代碼,該代碼實(shí)現(xiàn)了圖片的旋轉(zhuǎn)(90 度和 180 度)以及旋轉(zhuǎn)后圖片的下載功能。通過(guò)對(duì)代碼的解讀,我們可以學(xué)習(xí)到如何利用 Canvas API 進(jìn)行圖像操作,以及如何實(shí)現(xiàn)文件的下載功能。
二、HTML 結(jié)構(gòu)分析
- 基本結(jié)構(gòu):這段 HTML 代碼的基本結(jié)構(gòu)比較簡(jiǎn)單,包含了一個(gè)
<head>
部分和一個(gè)<body>
部分。<head>
部分主要用于設(shè)置頁(yè)面的元數(shù)據(jù)和引入外部樣式表,<body>
部分則包含了頁(yè)面的實(shí)際內(nèi)容。 - Canvas 元素:在
<body>
中,有一個(gè)<canvas>
元素,其id
為canvas
。這個(gè)元素是 HTML5 提供的用于繪制圖形和圖像的容器。如果用戶的瀏覽器不支持 HTML5 的<canvas>
標(biāo)簽,那么在<canvas>
標(biāo)簽內(nèi)的文本 “您的瀏覽器不支持 HTML5 canvas 標(biāo)簽。” 將會(huì)顯示出來(lái)。 - 下載按鈕:還有一個(gè)
<div>
元素,類名為download
,它作為一個(gè)下載按鈕,文本內(nèi)容為 “下載”。用戶點(diǎn)擊這個(gè)按鈕時(shí),將觸發(fā)相應(yīng)的 JavaScript 函數(shù)來(lái)實(shí)現(xiàn)圖片的下載。
三、CSS 樣式分析
- 下載按鈕樣式:通過(guò) CSS 樣式定義了
.download
類的樣式。設(shè)置了按鈕的寬度為100px
,高度為40px
,背景顏色為白色(#fff
),文字顏色為#276787
,邊框?yàn)?code>1px的實(shí)線,顏色為#276787
。使用display: flex;
、align-items: center;
和justify-content: center;
使按鈕內(nèi)的文本居中顯示。border-radius: 20px;
將按鈕的邊角設(shè)置為圓角,使其看起來(lái)更加美觀。 - 交互樣式:定義了按鈕的交互樣式。當(dāng)鼠標(biāo)懸停在按鈕上時(shí)(
.download:hover
),背景顏色變?yōu)?code>#276787,文字顏色變?yōu)榘咨?,邊框變?yōu)橥该?。?dāng)按鈕被按下時(shí)(.download:active
),按鈕的透明度變?yōu)?code>0.4,提供了視覺(jué)反饋。
四、JavaScript 功能實(shí)現(xiàn)
- 圖像加載與 Canvas 初始化:首先創(chuàng)建一個(gè)
<img>
元素用于加載原始圖像,并獲取<canvas>
元素及其 2D 繪圖上下文ctx
。設(shè)置原始圖像的src
屬性為一個(gè)在線圖片的 URL,并設(shè)置crossOrigin
屬性為anonymous
,以處理跨域問(wèn)題。當(dāng)圖像加載完成后(originImage.onload
事件觸發(fā)),獲取圖像的原始寬度ow
和高度oh
。 - 圖片旋轉(zhuǎn):
- 90 度旋轉(zhuǎn)(注釋部分):代碼中注釋掉了 90 度旋轉(zhuǎn)的實(shí)現(xiàn)。原本的邏輯是將 Canvas 的寬度設(shè)置為圖像的原始高度
oh
,高度設(shè)置為圖像的原始寬度ow
。然后使用ctx.rotate(-Math.PI / 2)
將繪圖上下文逆時(shí)針旋轉(zhuǎn) 90 度,再通過(guò)ctx.drawImage(originImage, -ow, 0)
將圖像繪制到 Canvas 上。最后再使用ctx.rotate(Math.PI / 2)
將繪圖上下文順時(shí)針旋轉(zhuǎn)回原來(lái)的角度。 - 180 度旋轉(zhuǎn)(實(shí)際實(shí)現(xiàn)):將 Canvas 的寬度和高度設(shè)置為圖像的原始寬度
ow
和高度oh
。使用ctx.rotate(Math.PI)
將繪圖上下文順時(shí)針旋轉(zhuǎn) 180 度,然后通過(guò)ctx.drawImage(originImage, -ow, -oh)
將圖像繪制到 Canvas 上,實(shí)現(xiàn)了圖像的 180 度旋轉(zhuǎn)。
- 90 度旋轉(zhuǎn)(注釋部分):代碼中注釋掉了 90 度旋轉(zhuǎn)的實(shí)現(xiàn)。原本的邏輯是將 Canvas 的寬度設(shè)置為圖像的原始高度
- 生成 Base64 編碼:旋轉(zhuǎn)后的圖像通過(guò)
canvas.toDataURL("image/jpeg", 0.5)
方法生成一個(gè) Base64 編碼的字符串,這里設(shè)置圖像格式為 JPEG,質(zhì)量為 0.5。生成的 Base64 編碼字符串存儲(chǔ)在base64
變量中。 - 下載功能實(shí)現(xiàn):
- 方式一(注釋部分):注釋掉了一種下載實(shí)現(xiàn)方式。原本的邏輯是創(chuàng)建一個(gè)
<a>
元素,將其href
屬性設(shè)置為生成的 Base64 編碼字符串,download
屬性設(shè)置為 “旋轉(zhuǎn)后的圖片.png”,然后模擬點(diǎn)擊這個(gè)<a>
元素來(lái)觸發(fā)下載。 - 方式二(實(shí)際實(shí)現(xiàn)):創(chuàng)建一個(gè)
<a>
元素,將其href
屬性設(shè)置為通過(guò)window.URL.createObjectURL(base64ToBlob(base64))
生成的對(duì)象 URL,download
屬性設(shè)置為 “旋轉(zhuǎn)后的圖片.jpg”。base64ToBlob
函數(shù)將 Base64 編碼字符串轉(zhuǎn)換為 Blob 對(duì)象,然后通過(guò)window.URL.createObjectURL
創(chuàng)建一個(gè)可用于下載的 URL。最后模擬點(diǎn)擊<a>
元素來(lái)實(shí)現(xiàn)圖片的下載。
- 方式一(注釋部分):注釋掉了一種下載實(shí)現(xiàn)方式。原本的邏輯是創(chuàng)建一個(gè)
- Base64 轉(zhuǎn) Blob 函數(shù):
base64ToBlob
函數(shù)用于將 Base64 編碼字符串轉(zhuǎn)換為 Blob 對(duì)象。它首先將 Base64 字符串分割,提取出 MIME 類型,然后使用atob
方法將 Base64 編碼的字符串解碼為二進(jìn)制字符串,再將二進(jìn)制字符串轉(zhuǎn)換為Uint8Array
,最后創(chuàng)建一個(gè)新的 Blob 對(duì)象并返回。
完整代碼展示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="./assets/global.css"> <style> .download { width: 100px; height: 40px; background-color: #fff; color: #276787; border: 1px solid #276787;
到此這篇關(guān)于基于 HTML5 Canvas 實(shí)現(xiàn)圖片旋轉(zhuǎn)與下載功能的文章就介紹到這了,更多相關(guān)html5 canvas圖片旋轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
html5 Canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)的示例
這篇文章主要介紹了htm5l Canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-15HTML5 Canvas 旋轉(zhuǎn)風(fēng)車?yán)L制
這篇文章主要介紹了HTML5 Canvas 旋轉(zhuǎn)風(fēng)車?yán)L制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-18實(shí)例講解利用HTML5 Canvas API操作圖形旋轉(zhuǎn)的方法
這篇文章主要介紹了利用HTML5 Canvas API操作圖形旋轉(zhuǎn)的方法的實(shí)例講解,包括圖片自身的中心坐標(biāo)位置旋轉(zhuǎn)以及圍繞某個(gè)點(diǎn)的旋轉(zhuǎn)例子,需要的朋友可以參考下2016-03-22詳解通過(guò)HTML5 Canvas實(shí)現(xiàn)圖片的平移及旋轉(zhuǎn)變化的方法
這篇文章主要介紹了通過(guò)HTML5 Canvas實(shí)現(xiàn)圖片的平移及旋轉(zhuǎn)變化的方法,其中旋轉(zhuǎn)講解的是配合平移坐標(biāo)系確定圓心位置而進(jìn)行的順時(shí)針旋轉(zhuǎn),需要的朋友可以參考下2016-03-22html5 canvas實(shí)現(xiàn)跟隨鼠標(biāo)旋轉(zhuǎn)的箭頭
這篇文章主要為大家詳細(xì)介紹了html5 canvas實(shí)現(xiàn)跟隨鼠標(biāo)旋轉(zhuǎn)的箭頭,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-11HTML5 Canvas旋轉(zhuǎn)動(dòng)畫的2個(gè)代碼例子(一個(gè)旋轉(zhuǎn)的太極圖效果)
這篇文章主要介紹了HTML5 Canvas旋轉(zhuǎn)動(dòng)畫的2個(gè)代碼例子,實(shí)現(xiàn)了一個(gè)旋轉(zhuǎn)的太極圖效果,學(xué)習(xí)HTML5 Canvas旋轉(zhuǎn)動(dòng)畫的朋友可以參考下2014-04-10HTML5 Canvas實(shí)現(xiàn)平移/放縮/旋轉(zhuǎn)deom示例(附截圖)
HTML5 Canvas中提供了實(shí)現(xiàn)圖形API,通過(guò)它可以簡(jiǎn)單的實(shí)現(xiàn)平移,旋轉(zhuǎn),放縮等等,下面與大家分享下平移,旋轉(zhuǎn),放縮的具體實(shí)現(xiàn)及參照?qǐng)D,感興趣的朋友可以參考下哈,希望對(duì)2013-07-04html5的畫布canvas——畫出弧線、旋轉(zhuǎn)的圖形實(shí)例代碼+效果圖
在做旋轉(zhuǎn)操作之前一定要理解一句話:旋轉(zhuǎn)的是畫布的坐標(biāo)系而不是圖形本身,首先認(rèn)識(shí)一下畫圓的坐標(biāo):中心、起始角、結(jié)束角;接下來(lái)的就很簡(jiǎn)單了2013-06-09html5使用canvas實(shí)現(xiàn)圖片下載功能的示例代碼
這篇文章主要介紹了html5使用canvas實(shí)現(xiàn)圖片下載功能的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-26