JavaScript實(shí)現(xiàn)點(diǎn)擊圖片翻轉(zhuǎn)效果
最近在做一個(gè)有關(guān)人臉采集的項(xiàng)目,然后在編寫(xiě)前端模塊時(shí),遇到了一個(gè)問(wèn)題,就是當(dāng)客戶(hù)上傳照片或直接拍照上傳時(shí),會(huì)遇到有些圖片可能會(huì)90度翻轉(zhuǎn)過(guò)來(lái)所以,我們需要給個(gè)按鈕客戶(hù)讓客戶(hù)自己可以對(duì)照品進(jìn)行旋轉(zhuǎn)效果大致如下
圖1.正常圖片上傳

圖2.圖片左旋轉(zhuǎn)

圖3.圖片右旋轉(zhuǎn)

以上就是一個(gè)圖片旋轉(zhuǎn)功能
下面我們就開(kāi)始代碼部分吧
這里我采取了一個(gè)方法,然后當(dāng)前我的圖片格式是base64,如果遇到其它格式也無(wú)所謂,因?yàn)槲覀冏罱K的效果還是要轉(zhuǎn)為image對(duì)象來(lái)實(shí)現(xiàn)的
/**
* 圖片旋轉(zhuǎn)
* @param direction 旋轉(zhuǎn)的方向
*/
rotate (direction) {
const img = new Image()
// 這里的思維就是,把圖片映射到一個(gè)畫(huà)板上,然后對(duì)圖片進(jìn)行重新繪制,所以這里要建一個(gè)canvas對(duì)象來(lái)充當(dāng)我們的畫(huà)板
const canvas = document.createElement('canvas')
// base64轉(zhuǎn)換image對(duì)象
img.src = this.uploadImage
// 這里記得一定要在base64轉(zhuǎn)換成圖片對(duì)象后再進(jìn)行其它操作,筆者在這里踩了個(gè)坑,onload方法就是圖片加載再進(jìn)行其它操作,如果圖片是文件路徑方式跨域調(diào)用效果更加明顯
img.onload = () => {
// img的高度和寬度不能在img元素隱藏后獲取,否則會(huì)出錯(cuò)
const height = img.height
const width = img.width
// 旋轉(zhuǎn)角度以弧度值為參數(shù)
const ctx = canvas.getContext('2d')
if (direction === 'right') {
canvas.width = height
canvas.height = width
ctx.rotate(90 * Math.PI / 180)
ctx.drawImage(img, 0, 0, width, -height)
} else {
canvas.width = height
canvas.height = width
ctx.rotate(-90 * Math.PI / 180)
ctx.drawImage(img, 0, 0, -width, height)
}
// 旋轉(zhuǎn)后的圖片重新轉(zhuǎn)為base64
this.uploadImage = this.getBase64Image(img, canvas)
}
},
/**
* 把image文件轉(zhuǎn)為base64
*/
getBase64Image (img, canvas) {
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0, img.width, img.height)
const ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase()
return canvas.toDataURL('image/' + ext)
}
注意:如果圖片是跨域獲取的話這里可能會(huì)使canvas轉(zhuǎn)回base64出現(xiàn)問(wèn)題,這時(shí)可能需要開(kāi)啟代理來(lái)進(jìn)行圖片獲取
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中英文字符長(zhǎng)度統(tǒng)計(jì)方法示例【按照中文占2個(gè)字符】
這篇文章主要介紹了JavaScript中英文字符長(zhǎng)度統(tǒng)計(jì)方法,涉及javascript針對(duì)中英文字符的匹配與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
一文帶你玩轉(zhuǎn)JavaScript的箭頭函數(shù)
在ES6中新增了函數(shù)的簡(jiǎn)寫(xiě)方式----箭頭函數(shù),箭頭函數(shù)的出現(xiàn)不僅簡(jiǎn)化了大量代碼,也讓代碼看起來(lái)更加優(yōu)雅,同時(shí)也解決了this指向問(wèn)題,下面我們就來(lái)詳細(xì)講解如何玩轉(zhuǎn)箭頭函數(shù)2022-09-09
js實(shí)現(xiàn)動(dòng)態(tài)增加文件域表單功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)動(dòng)態(tài)增加文件域表單功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
在html頁(yè)面上拖放移動(dòng)標(biāo)簽
在html頁(yè)面上拖放移動(dòng)標(biāo)簽,需要的朋友可以參考下。2010-01-01
使用JS實(shí)現(xiàn)在空白頁(yè)上展示出一個(gè)有趣的時(shí)鐘
在我們?nèi)粘5木W(wǎng)頁(yè)瀏覽中,空白的頁(yè)面往往會(huì)被視為一種無(wú)趣的事物,一片等待填充的空間,今天我們來(lái)學(xué)習(xí)一下如何使用JS在空白的網(wǎng)頁(yè)上展示出一個(gè)有趣的時(shí)鐘吧,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-04-04
微信小程序?qū)崿F(xiàn)select二級(jí)下拉
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)select二級(jí)下拉效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
JavaScript輸出為[object?Object]問(wèn)題的解決辦法
平時(shí)我們?cè)诮邮蘸蠖朔祷氐膉son對(duì)象通常是一個(gè)字符串類(lèi)型的object,所以一般我們要對(duì)這個(gè)object進(jìn)行類(lèi)型轉(zhuǎn)化后,我們才能使用object里面的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于JavaScript輸出為[object?Object]問(wèn)題的解決辦法,需要的朋友可以參考下2023-11-11
JavaScript雙向鏈表實(shí)現(xiàn)LFU緩存算法
本文主要介紹了JavaScript雙向鏈表實(shí)現(xiàn)LFU緩存算法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

