用js實現(xiàn)圖片旋轉(zhuǎn)的兩種方案
一、圖片旋轉(zhuǎn)的方案介紹
1、用css的rotate與translate實現(xiàn)
2、用js的canvas實現(xiàn)
二、方案1的缺陷
用css的rotate方案來實現(xiàn)的時,如果圖片是長方形,則圖片左側(cè)會有空白區(qū)域。如果要用translate來實現(xiàn)向左平移時,可以解決左側(cè)留白問題。但是當圖片旋轉(zhuǎn)后再顯示時,寬度可能超出父盒子的寬度,致使效果無法達到預期。

三、canvas實現(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)圖片后,返回一個圖片信息對象
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 }; //裁剪坐標
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向畫布上繪制圖片
ctx?.drawImage(image, 0, 0);
//getImageData() 復制畫布上指定矩形的像素數(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ù)放回畫布
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 策略,會存在跨域問題,雖然可以使用圖像(比如append到頁面上)但是繪制到畫布上會污染畫布,一旦一個畫布被污染,就無法提取畫布的數(shù)據(jù),比如無法使用使用畫布toBlob(),toDataURL(),或getImageData()方法。
2、canvas.toDataURL(‘image/png’)
// 改成image/jpeg時,圖片尺寸會更小。圖片類型影響圖片尺寸大小。例如:如果原圖片大小為500kb,傳入image/png時,圖片可能是5MB,傳入image/jpeg可能只有500kb左右。
3、this.rotateBase64Img(imgList[i].src, 90, (url) => {})中,只能旋轉(zhuǎn)90度,180度、270度等能夠被90整除的度數(shù)。
四、效果

OK,搞定~
總結(jié)
到此這篇關(guān)于用js實現(xiàn)圖片旋轉(zhuǎn)的兩種方案的文章就介紹到這了,更多相關(guān)js圖片旋轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序轉(zhuǎn)發(fā)事件實現(xiàn)解析
這篇文章主要介紹了微信小程序轉(zhuǎn)發(fā)事件實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
使用 JavaScript 創(chuàng)建可維護的幻燈片效果代碼
顯然,效果很實用。對于這個效果,我們并不解釋如何去使用效果庫,而是講解如何創(chuàng)建類似的效果,并保持他的可用性,分離式(unobtrusive),可維護性(讓未來的維護者,在不需要修改你的腳本的情況下,修改圖片,外觀或文本標簽)。2008-06-06
JavaScript中setInterval()和setTimeout()的用法及區(qū)別
這篇文章主要給大家介紹了關(guān)于JavaScript中setInterval()和setTimeout()用法及區(qū)別的相關(guān)資料,Javascript的setTimeOut和setInterval函數(shù)應(yīng)用非常廣泛,它們都用來處理延時和定時任務(wù),需要的朋友可以參考下2023-11-11

