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

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

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

以上就是一個(gè)圖片旋轉(zhuǎn)功能
下面我們就開始代碼部分吧
這里我采取了一個(gè)方法,然后當(dāng)前我的圖片格式是base64,如果遇到其它格式也無所謂,因?yàn)槲覀冏罱K的效果還是要轉(zhuǎn)為image對象來實(shí)現(xiàn)的
/**
* 圖片旋轉(zhuǎn)
* @param direction 旋轉(zhuǎn)的方向
*/
rotate (direction) {
const img = new Image()
// 這里的思維就是,把圖片映射到一個(gè)畫板上,然后對圖片進(jìn)行重新繪制,所以這里要建一個(gè)canvas對象來充當(dāng)我們的畫板
const canvas = document.createElement('canvas')
// base64轉(zhuǎn)換image對象
img.src = this.uploadImage
// 這里記得一定要在base64轉(zhuǎn)換成圖片對象后再進(jìn)行其它操作,筆者在這里踩了個(gè)坑,onload方法就是圖片加載再進(jìn)行其它操作,如果圖片是文件路徑方式跨域調(diào)用效果更加明顯
img.onload = () => {
// img的高度和寬度不能在img元素隱藏后獲取,否則會出錯
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)
}
注意:如果圖片是跨域獲取的話這里可能會使canvas轉(zhuǎn)回base64出現(xiàn)問題,這時(shí)可能需要開啟代理來進(jìn)行圖片獲取
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript document.referrer 用法
document對象的referrer屬性,返回導(dǎo)航到當(dāng)前網(wǎng)頁的超鏈接所在網(wǎng)頁的URL。2009-04-04
javascript代碼在ie8里報(bào)錯 document.getElementById(...) 為空或不是對象的解決方
今天更升級了ie8,發(fā)現(xiàn)原來在ie7下可以運(yùn)行的代碼,不能運(yùn)行了,發(fā)現(xiàn)了一些細(xì)節(jié),附臨時(shí)修改辦法。2009-11-11
JavaScript計(jì)算出現(xiàn)精度丟失問題的解決方法
Javascript作為一門大型編程語言,在日常開發(fā)中難免會涉及到大量的數(shù)學(xué)計(jì)算,然而,浮點(diǎn)數(shù)在計(jì)算過程中可能出現(xiàn)精度的問題,下面我們就來學(xué)習(xí)一下Javascript中高精度計(jì)算及其相關(guān)知識吧2023-11-11
hash特點(diǎn)、hashchange事件介紹及其常見應(yīng)用場景
淺析hash特點(diǎn)、hashchange事件介紹及其常見應(yīng)用場景(不同hash對應(yīng)不同事件處理、移動端大圖展示狀態(tài)后退頁面問題、原生輕應(yīng)用頭部后退問題、移動端自帶返回按鈕二次確認(rèn)問題),hashchange和popstate事件觸發(fā)條件2023-11-11
基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交功能,需要的朋友可以參考下2017-08-08

