亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript處理移動端拍攝圖片旋轉問題的方法

發布時間:2021-02-02 13:39:33 來源:億速云 閱讀:222 作者:小新 欄目:web開發

這篇文章主要介紹JavaScript處理移動端拍攝圖片旋轉問題的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

第一步:引入exif-js

<script src="https://cdn.jsdelivr.net/npm/exif-js@2.3.0/exif.min.js"></script>

第二步:

/**
 * 處理圖片文件(處理移動端拍攝圖片旋轉問題)
 * fileObj.file 圖片文件獨享
 * fileObj.resolution 在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區間內選擇圖片的質量。
 * fileObj.fileType 輸入的文件類型,1 file對象,2 blob對象,3 base64字符串
 * fileObj.fileName 輸出的文件名稱,默認為picture.jpeg
 * fileObj.callback 回調函數
 */
function handleImageFile(fileObj) {
  // 給參數附初始值
  fileObj.fileName = fileObj.hasOwnProperty("fileName") ? "images/" + fileObj.fileName : "images/picture.jpeg";
  // 獲取文件類型
  var fType = fileObj.file.type;
  if (fType.indexOf("image") === -1) return fileObj.callback({
    status: 500,
    message: "文件類型不正確",
    data: null
  });
  if (!EXIF) return fileObj.callback({
    status: 500,
    message: "EXIF 不存在",
    data: null
  });
  if (fileObj.file) {
    // 獲取照片方向角屬性,用戶旋轉控制
    EXIF.getData(fileObj.file, function () {
      var orientation = EXIF.getTag(this, 'Orientation');
      var oReader = new FileReader();
      oReader.onload = function (e) {
        var image = new Image();
        image.src = e.target.result;
        image.onload = function () {
          var canvas = document.createElement("canvas");
          var ctx = canvas.getContext("2d");
          var resultFile = null;
          var ua = navigator.userAgent;
          canvas.width = this.naturalWidth;
          canvas.height = this.naturalHeight;
          ctx.drawImage(this, 0, 0, this.naturalWidth, this.naturalHeight);
          // android終端
          var isAdr = ua.indexOf("Android") > -1 || ua.indexOf("Adr") > -1;
          // ios終端
          var isIOS = ua.indexOf("iPhone") > -1 || ua.indexOf("iOS") > -1;
          // 修復ios 或 Android
          if (isIOS || isAdr) {
            // 如果方向角不為1,都需要進行旋轉
            if (orientation && orientation !== "" && orientation !== 1) {
              switch (orientation) {
                case 6: // 需要順時針(向左)90度旋轉
                  rotateImg(this, "left", canvas);
                  break;
                case 8: // 需要逆時針(向右)90度旋轉
                  rotateImg(this, "right90", canvas);
                  break;
                case 3: // 需要180度旋轉,轉兩次
                  rotateImg(this, "right180", canvas);
                  break;
              }
            }
            resultFile = canvas.toDataURL("image/jpeg", fileObj.resolution);
          } else {
            resultFile = canvas.toDataURL("image/jpeg", fileObj.resolution);
          }
          switch (fileObj.fileType) {
            case 1:
            case 2:
              fileObj.callback({
                status: 200,
                message: "success",
                data: dataURLtoFile(resultFile, fileObj.fileType, fileObj.fileName)
              });
              break;
            case 3:
              fileObj.callback({
                status: 200,
                message: "success",
                data: resultFile
              });
              break;
            default:
              break;
          }
        };
      };
      oReader.readAsDataURL(fileObj.file);
    });
  } else {
    return fileObj.callback({
      status: 500,
      message: "文件不存在",
      data: null
    });
  }
  /**
   * 旋轉圖片
   */
  function rotateImg(img, direction, canvas) {
    if (img === null) return;
    // 最小與最大旋轉方向,圖片旋轉4次后回到原方向
    var minStep = 0;
    var maxStep = 3;
    // img的高度和寬度不能在img元素隱藏后獲取,否則會出錯
    var width = img.width;
    var height = img.height;
    var step = 2;
    if (step === null) step = minStep;
    if (direction === "right90") {
      step++;
      step > maxStep && (step = minStep);
    } else if(direction === "right180") {
      step = 2;
    } else {
      step--;
      step < minStep && (step = maxStep);
    }
    // 旋轉角度以弧度值為參數
    var degree = step * 90 * Math.PI / 180;
    var ctx = canvas.getContext("2d");
    switch (step) {
      case 0:
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0, width, height);
        break;
      case 1:
        canvas.width = height;
        canvas.height = width;
        ctx.rotate(degree);
        ctx.drawImage(img, 0, -height, width, height);
        break;
      case 2:
        canvas.width = width;
        canvas.height = height;
        ctx.rotate(degree);
        ctx.drawImage(img, -width, -height, width, height);
        break;
      case 3:
        canvas.width = height;
        canvas.height = width;
        ctx.rotate(degree);
        ctx.drawImage(img, -width, 0, width, height);
        break;
    }
  }
  /**
   * type:1 file對象,2 blob對象
   */
  function dataURLtoFile(dataurl, type, filename) {
    var arr = dataurl.split(',');
    var mime = arr[0].match(/:(.*?);/)[1];
    var bstr = atob(arr[1]);
    var n = bstr.length;
    var u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    if (type === 1) { // 轉換成file對象
      return new File([u8arr], filename, {
        type: mime
      });
    } else { // 轉換成成blob對象
      return new Blob([u8arr], {
        type: mime
      });
    }
  }
}

以上是“JavaScript處理移動端拍攝圖片旋轉問題的方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

达拉特旗| 彰化市| 广饶县| 庄河市| 大宁县| 上犹县| 平凉市| 张家界市| 泰来县| 始兴县| 宁津县| 长泰县| 常山县| 深水埗区| 阿巴嘎旗| 鄂州市| 卓资县| 兴宁市| 淅川县| 遂平县| 普宁市| 新泰市| 甘孜| 横山县| 黄陵县| 定州市| 紫云| 西华县| 兰坪| 那曲县| 安义县| 伊通| 绍兴县| 安多县| 阳东县| 安陆市| 和政县| 城口县| 桦南县| 马边| 密云县|