最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript如何處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題

 更新時(shí)間:2019年11月16日 15:21:10   作者:隨遇而安、1314  
這篇文章主要告訴大家JavaScript如何處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了js移動(dòng)端拍攝圖片旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下

第一步:引入exif-js

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

第二步:

/**
 * 處理圖片文件(處理移動(dòng)端拍攝圖片旋轉(zhuǎn)問題)
 * fileObj.file 圖片文件獨(dú)享
 * fileObj.resolution 在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。
 * fileObj.fileType 輸入的文件類型,1 file對(duì)象,2 blob對(duì)象,3 base64字符串
 * fileObj.fileName 輸出的文件名稱,默認(rèn)為picture.jpeg
 * fileObj.callback 回調(diào)函數(shù)
 */
function handleImageFile(fileObj) {
  // 給參數(shù)附初始值
  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) {
    // 獲取照片方向角屬性,用戶旋轉(zhuǎn)控制
    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;
          // 修復(fù)ios 或 Android
          if (isIOS || isAdr) {
            // 如果方向角不為1,都需要進(jìn)行旋轉(zhuǎn)
            if (orientation && orientation !== "" && orientation !== 1) {
              switch (orientation) {
                case 6: // 需要順時(shí)針(向左)90度旋轉(zhuǎn)
                  rotateImg(this, "left", canvas);
                  break;
                case 8: // 需要逆時(shí)針(向右)90度旋轉(zhuǎn)
                  rotateImg(this, "right90", canvas);
                  break;
                case 3: // 需要180度旋轉(zhuǎn),轉(zhuǎn)兩次
                  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
    });
  }
  /**
   * 旋轉(zhuǎn)圖片
   */
  function rotateImg(img, direction, canvas) {
    if (img === null) return;
    // 最小與最大旋轉(zhuǎn)方向,圖片旋轉(zhuǎn)4次后回到原方向
    var minStep = 0;
    var maxStep = 3;
    // img的高度和寬度不能在img元素隱藏后獲取,否則會(huì)出錯(cuò)
    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);
    }
    // 旋轉(zhuǎn)角度以弧度值為參數(shù)
    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對(duì)象,2 blob對(duì)象
   */
  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) { // 轉(zhuǎn)換成file對(duì)象
      return new File([u8arr], filename, {
        type: mime
      });
    } else { // 轉(zhuǎn)換成成blob對(duì)象
      return new Blob([u8arr], {
        type: mime
      });
    }
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript實(shí)現(xiàn)函數(shù)緩存及應(yīng)用場(chǎng)景

    JavaScript實(shí)現(xiàn)函數(shù)緩存及應(yīng)用場(chǎng)景

    在JavaScript中,可以通過函數(shù)緩存來(lái)提高函數(shù)的執(zhí)行效率,本文就來(lái)介紹一下JavaScript實(shí)現(xiàn)函數(shù)緩存及應(yīng)用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 一文了解你不知道的JavaScript生成器篇

    一文了解你不知道的JavaScript生成器篇

    ES6引入了一個(gè)新的函數(shù)類型,發(fā)現(xiàn)它并不符合這種運(yùn)行到結(jié)束的特性。這類新的函數(shù)被稱為生成器。生成器的出現(xiàn)是我們知道原來(lái)有時(shí)代碼并不會(huì)順利的運(yùn)行,可以通過暫停的方式進(jìn)行異步回調(diào),讓我們摒棄了此前的認(rèn)知。本文就來(lái)聊聊JavaScript中生成器的相關(guān)知識(shí)
    2022-11-11
  • javascript 頁(yè)面只自動(dòng)刷新一次

    javascript 頁(yè)面只自動(dòng)刷新一次

    記得meta標(biāo)簽當(dāng)中有一個(gè)refresh的功能嗎?這是讓瀏覽的頁(yè)面刷新并可以轉(zhuǎn)到相應(yīng)的頁(yè)面,如果刷新本頁(yè)的話就會(huì)造成重復(fù)的刷新,現(xiàn)在我們就試試用腳本來(lái)實(shí)現(xiàn)只讓頁(yè)面刷新一次.
    2009-07-07
  • javascript實(shí)現(xiàn)的鼠標(biāo)鏈接提示效果生成器代碼

    javascript實(shí)現(xiàn)的鼠標(biāo)鏈接提示效果生成器代碼

    javascript實(shí)現(xiàn)的鼠標(biāo)鏈接提示效果生成器代碼...
    2007-06-06
  • javascript jscroll模擬html元素滾動(dòng)條

    javascript jscroll模擬html元素滾動(dòng)條

    這里是自己在工作不太忙的時(shí)候?qū)懗鰜?lái)了一個(gè)用戶可以自定義的滾動(dòng)條jscroll,以下簡(jiǎn)稱jscroll。jscroll默認(rèn)只提供一種滾動(dòng)條樣式,部分樣式來(lái)自google webstore ,其中有部分css3樣式主要用于實(shí)現(xiàn)圓角,陰影效果
    2012-12-12
  • 構(gòu)建一個(gè)JavaScript插件系統(tǒng)

    構(gòu)建一個(gè)JavaScript插件系統(tǒng)

    這篇文章主要介紹了如何構(gòu)建一個(gè)JavaScript插件系統(tǒng),幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2020-10-10
  • NodeJS的Promise的用法解析

    NodeJS的Promise的用法解析

    下面小編就為大家?guī)?lái)一篇NodeJS的Promise的用法解析。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考
    2016-05-05
  • JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式

    JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式

    這篇文章主要介紹了JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JS折半插入排序算法實(shí)例

    JS折半插入排序算法實(shí)例

    這篇文章主要介紹了JS折半插入排序算法,以完整實(shí)例形式較為詳細(xì)的分析了JavaScript實(shí)現(xiàn)折半插入排序的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-12-12
  • JavaScript清除所有(多個(gè))定時(shí)器的方法實(shí)戰(zhàn)案例

    JavaScript清除所有(多個(gè))定時(shí)器的方法實(shí)戰(zhàn)案例

    定時(shí)器就是由JS提供了一些原生方法來(lái)實(shí)現(xiàn)延時(shí)去執(zhí)行某一段代碼,下面這篇文章主要給大家介紹了關(guān)于JavaScript清除所有(多個(gè))定時(shí)器的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論

德化县| 泸水县| 关岭| 托里县| 河津市| 诏安县| 嘉善县| 景洪市| 枝江市| 安化县| 上蔡县| 兴安县| 仪陇县| 夏津县| 启东市| 广平县| 平昌县| 安福县| 高安市| 天镇县| 习水县| 奉贤区| 大足县| 繁峙县| 灵山县| 徐水县| 来凤县| 延庆县| 井冈山市| 阜新市| 依兰县| 陆丰市| 寻乌县| 陈巴尔虎旗| 西安市| 武川县| 桐乡市| 社旗县| 云梦县| 合江县| 田东县|