jsを使用して画像の回転を実現する方法

1. 画像回転の仕組みの紹介

1. cssの回転と平行移動で実現
2. jsのcanvasで実現



2. スキーム 1 の欠陥

CSSの回転スキームを使用すると、画像が長方形の場合、画像の左側に空白の領域ができます。翻訳を使用して左への翻訳を実現したい場合は、左の空白の問題を解決できます。ただし、画像を回転して表示すると、親ボックスの幅を超えてしまい、期待どおりの効果が得られない場合があります。
ここに画像の説明を挿入


3. 画像の回転を実現するCanvas

<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,旋转图片后,返回一个图片信息对象
    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('旋转角度必须是90的倍数!');
        throw '旋转角度必须是90的倍数!';
      }
      edg < 0 && (edg = (edg % 360) + 360);
      const quadrant = (edg / 90) % 4; //旋转象限
      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() 复制画布上指定矩形的像素数据
        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() 将图像数据放回画布
        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 ポリシーによって制限されているため、クロスドメインの問題が発生します。画像は使用できますが (ページへの追加など)、キャンバス上に描画するとキャンバスが汚染されます。キャンバスが汚染されると、キャンバスのデータが失われます。たとえば、抽出できません。使用できません。 Canvas 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) => {}) は、90 度、180 度、270 度、および 90 で割り切れるその他の度のみ回転できます。



4.効果

ここに画像の説明を挿入
はい、完了しました〜
お役に立った場合は、「いいね!」をお願いします。ありがとう~~

おすすめ

転載: blog.csdn.net/weixin_45689946/article/details/130533148