用js實(shí)現(xiàn)圖片旋轉(zhuǎn)的兩種方案
一、圖片旋轉(zhuǎn)的方案介紹
1、用css的rotate與translate實(shí)現(xiàn)
2、用js的canvas實(shí)現(xiàn)
二、方案1的缺陷
用css的rotate方案來(lái)實(shí)現(xiàn)的時(shí),如果圖片是長(zhǎng)方形,則圖片左側(cè)會(huì)有空白區(qū)域。如果要用translate來(lái)實(shí)現(xiàn)向左平移時(shí),可以解決左側(cè)留白問(wèn)題。但是當(dāng)圖片旋轉(zhuǎn)后再顯示時(shí),寬度可能超出父盒子的寬度,致使效果無(wú)法達(dá)到預(yù)期。
三、canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)
<template> <div style="width: 100%; height: 100%"> <img class="img-item" src="https://img2.baidu.com/it/u=1906732828,3160455141&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=666" /> <img class="img-item" src="https://img0.baidu.com/it/u=2911164322,2998857390&fm=253&fmt=auto&app=138&f=JPEG?w=346&h=500" /> </div> </template> <script> export default { name: "deviceAssets", data() { return {} }, mounted() { this.initPage() }, methods: { initPage() { this.$nextTick(async() => { let imgList = document.getElementsByClassName("img-item") if (!imgList) return for(let i=0; i < imgList.length; i++) { this.rotateBase64Img(imgList[i].src, 90, (url) => { console.log(`imgList[${i}].src`, url) imgList[i].src = url }) } }) }, // 傳入圖片src,旋轉(zhuǎn)圖片后,返回一個(gè)圖片信息對(duì)象 rotateBase64Img(src, edg, callback) { var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var imgW; //圖片寬度 var imgH; //圖片高度 var size; //canvas初始大小 if (edg % 90 != 0) { console.error('旋轉(zhuǎn)角度必須是90的倍數(shù)!'); throw '旋轉(zhuǎn)角度必須是90的倍數(shù)!'; } edg < 0 && (edg = (edg % 360) + 360); const quadrant = (edg / 90) % 4; //旋轉(zhuǎn)象限 const cutCoor = { sx: 0, sy: 0, ex: 0, ey: 0 }; //裁剪坐標(biāo) var image = new Image(); image.crossOrigin = 'anonymous'; image.src = src; image.onload = function () { console.log('加載了'); imgW = image.width; imgH = image.height; size = imgW > imgH ? imgW : imgH; canvas.width = size * 2; canvas.height = size * 2; switch (quadrant) { case 0: cutCoor.sx = size; cutCoor.sy = size; cutCoor.ex = size + imgW; cutCoor.ey = size + imgH; break; case 1: cutCoor.sx = size - imgH; cutCoor.sy = size; cutCoor.ex = size; cutCoor.ey = size + imgW; break; case 2: cutCoor.sx = size - imgW; cutCoor.sy = size - imgH; cutCoor.ex = size; cutCoor.ey = size; break; case 3: cutCoor.sx = size; cutCoor.sy = size - imgW; cutCoor.ex = size + imgH; cutCoor.ey = size + imgW; break; } ctx?.translate(size, size); ctx?.rotate((edg * Math.PI) / 180); //drawImage向畫(huà)布上繪制圖片 ctx?.drawImage(image, 0, 0); //getImageData() 復(fù)制畫(huà)布上指定矩形的像素?cái)?shù)據(jù) var imgData = ctx?.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey); if (quadrant % 2 == 0) { canvas.width = imgW; canvas.height = imgH; } else { canvas.width = imgH; canvas.height = imgW; } //putImageData() 將圖像數(shù)據(jù)放回畫(huà)布 ctx?.putImageData(imgData, 0, 0); callback(canvas.toDataURL('image/png')); }; } } } </script> <style lang="scss" scoped> .iframe { width: 98%; height: 98%; box-sizing: border-box; } .img-box { width: 700px; height: 700px; background-color: #ccc; .img { width: 100%; transform: rotateZ(90deg) ; } } </style>
注意:
1、image.crossOrigin = 'anonymous’一定不能漏。
// 受限于 CORS 策略,會(huì)存在跨域問(wèn)題,雖然可以使用圖像(比如append到頁(yè)面上)但是繪制到畫(huà)布上會(huì)污染畫(huà)布,一旦一個(gè)畫(huà)布被污染,就無(wú)法提取畫(huà)布的數(shù)據(jù),比如無(wú)法使用使用畫(huà)布toBlob(),toDataURL(),或getImageData()方法。
2、canvas.toDataURL(‘image/png’)
// 改成image/jpeg時(shí),圖片尺寸會(huì)更小。圖片類型影響圖片尺寸大小。例如:如果原圖片大小為500kb,傳入image/png時(shí),圖片可能是5MB,傳入image/jpeg可能只有500kb左右。
3、this.rotateBase64Img(imgList[i].src, 90, (url) => {})中,只能旋轉(zhuǎn)90度,180度、270度等能夠被90整除的度數(shù)。
四、效果
OK,搞定~
總結(jié)
到此這篇關(guān)于用js實(shí)現(xiàn)圖片旋轉(zhuǎn)的兩種方案的文章就介紹到這了,更多相關(guān)js圖片旋轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript顯式類型轉(zhuǎn)換實(shí)例分析
這篇文章主要介紹了javascript顯式類型轉(zhuǎn)換,實(shí)例分析了javascript實(shí)現(xiàn)類型轉(zhuǎn)換的常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04微信小程序轉(zhuǎn)發(fā)事件實(shí)現(xiàn)解析
這篇文章主要介紹了微信小程序轉(zhuǎn)發(fā)事件實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10JS中Math對(duì)象使用示例(秒懂如何使用Math對(duì)象)
這篇文章主要給大家介紹了關(guān)于JS中Math對(duì)象使用的相關(guān)資料,Math和其他的對(duì)象不同,它不是一個(gè)構(gòu)造函數(shù),它屬于一個(gè)工具類,不用創(chuàng)建對(duì)象,它里面封裝了數(shù)學(xué)運(yùn)算相關(guān)的屬性和方法,需要的朋友可以參考下2024-06-06使用 JavaScript 創(chuàng)建可維護(hù)的幻燈片效果代碼
顯然,效果很實(shí)用。對(duì)于這個(gè)效果,我們并不解釋如何去使用效果庫(kù),而是講解如何創(chuàng)建類似的效果,并保持他的可用性,分離式(unobtrusive),可維護(hù)性(讓未來(lái)的維護(hù)者,在不需要修改你的腳本的情況下,修改圖片,外觀或文本標(biāo)簽)。2008-06-06原生JS實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04JavaScript中setInterval()和setTimeout()的用法及區(qū)別
這篇文章主要給大家介紹了關(guān)于JavaScript中setInterval()和setTimeout()用法及區(qū)別的相關(guān)資料,Javascript的setTimeOut和setInterval函數(shù)應(yīng)用非常廣泛,它們都用來(lái)處理延時(shí)和定時(shí)任務(wù),需要的朋友可以參考下2023-11-11