iOS和小米手機拍照上傳後,在web端顯示旋轉

来源:https://www.cnblogs.com/zheng577564429/archive/2018/09/07/9603555.html
-Advertisement-
Play Games

( ′◔ ‸◔`)現在的公司啊都流行混合開發,我們公司也不例外,非要把交互非常多的社區模塊用內嵌web頁展示,好吧好吧,畢竟有的應用也是這麼做的,那既然是社區就肯定少不了用戶上傳圖片的操作,在開發階段沒有發現任何問題,也是很奇怪,等到了測試階段,發現部分機型和IOS機型拍照之後,web頁獲取路徑之後 ...


( ′◔ ‸◔`)現在的公司啊都流行混合開發,我們公司也不例外,非要把交互非常多的社區模塊用內嵌web頁展示,好吧好吧,畢竟有的應用也是這麼做的,那既然是社區就肯定少不了用戶上傳圖片的操作,在開發階段沒有發現任何問題,也是很奇怪,等到了測試階段,發現部分機型和IOS機型拍照之後,web頁獲取路徑之後展示的圖片和圖片文件全不是正確的方向,旋轉了90°、180°的都有,於是去網上查找原因,結果就是……

大於2M的圖片!並且是豎拍的圖片!在生成照片的時候圖片的Orientation屬性會被重寫!!!!所以部分機型和IOS 都會出現旋轉的問題!

可惡!

當然方法也百度到了,只不過大部分都是只放了代碼,並沒有講解,其實理解了也非常簡單。

一、安裝插件 ︶︿︶

解決這個問題首先是要藉助插件的,因為我們前端旋轉了圖片只是在頁面上看上去旋轉了,並沒有解決根本問題,於是就要用到 exif.js這個工具。

https://www.npmjs.com/package/exif-js

一個強大的讀取圖片數據的工具,安裝也很簡單文檔里也有,就不多說了,因為我使用的是Vue,所以之間npm安裝後在需要使用的頁面引入:

import exif from "exif-js";

到這裡就算完成了插件的全部安裝;

二、開工!(^-^)V

首先在選擇框的change事件中我們直接調用exif的方法;

let Orientation = 0;
exif.getData(e.target.files[0], function() {
    exif.getAllTags(this);
    Orientation = exif.getTag(this, 'Orientation');
});
//e.target.files[0]為獲取的第一個圖片文件,如果是多個圖片文件可進行遍歷

這時候我們就已經獲取到圖片的Orientation屬性了,這個屬性就是圖片的方向屬性,不同的值代表不同的方向:

圖片正常 1
圖片朝右 6
圖片朝左 8
圖片倒置 3

後來經過測試Orientation還會有一個值,就是0,當Orientation等於0的時候圖片是正常的,但0代表的意思,還沒有找到。

那麼現在就可以對圖片進行處理了let canvas = document.createElement("canvas");

let ctx = canvas.getContext("2d");
let width = img.width;
let height = img.height;
switch(orientation) {
    case 0:
        //不做任何處理直接畫圖
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0)
        break;
    case 1:
        //不做任何處理直接畫圖
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0)
        break;
    case 6:
        //圖片順時針旋轉90°
        canvas.height = width;
        canvas.width = height;
        ctx.rotate(Math.PI / 2);
        ctx.translate(0, -height);
        ctx.drawImage(img, 0, 0)
        break;
     case 3:
        //圖片旋轉180°
        canvas.height = height;
        canvas.width = width;
        ctx.rotate(Math.PI);
        ctx.translate(-width, -height);
        ctx.drawImage(img, 0, 0)
        break;
     case 8:
        //圖片逆時針旋轉90°
        canvas.height = width;
        canvas.width = height;
        ctx.rotate(-Math.PI / 2);
        ctx.translate(-height, 0);
        ctx.drawImage(img, 0, 0)
        break;
     case undefined:
        //不作任何處理直接畫圖
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0)
        break;    
}      
let ndata=canvas.toDataURL("image/jpeg", 1);

這裡圖片的處理就是把圖片原原本本的在canvas上畫一遍,然後把它轉成正確的方向就可以了,那麼縮略圖就可以直接展示ndata就可以了。

但是這裡還只是一張圖片,我們不可能給後臺傳圖片base64碼過去,必須是圖片文件才可以,那麼這裡就要用到base64的轉碼。

首先是base64轉碼函數的封裝:

    // base64轉成bolb對象
      dataURItoBlob(base64Data) {
        let byteString;
        if(base64Data.split(",")[0].indexOf("base64") >= 0)
          byteString = atob(base64Data.split(",")[1]);
        else byteString = unescape(base64Data.split(",")[1]);
        let mimeString = base64Data
          .split(",")[0]
          .split(":")[1]
          .split(";")[0];
        let ia = new Uint8Array(byteString.length);
        for(let i = 0; i < byteString.length; i++) {
          ia[i] = byteString.charCodeAt(i);
        }
        return new Blob([ia], {
          type: mimeString
        });
      },

然後將上面我們轉換好的ndata通過base64轉換成圖片文件就可以了。

//調用轉換函數將base64碼轉換成圖片文件
let blob = this.dataURItoBlob(ndata);
//將新文件名與原圖片文件保持一致
blob.name = e.target.files[0].name;
//將新文件放到我們需要傳給後臺的文件數組裡
this.files.push(blob);

 

三、結束o(゚Д゚)っ

以上就是對圖片旋轉做的處理,很簡單,我們就可以理解為圖片的重繪。當然上面的方法只是單個圖片的轉換,如果用戶同時上傳了多個圖片,那麼就在對應的地方添加遍歷迴圈就可以了。

如果有不足的地方希望大家補充,有不對的地方也請大家批評指正。

如果還不太明白也可以通過我的聯繫方式進行討論。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "項目地址" 如遇網路不佳,請移步 "國內鏡像加速節點" 前端技術: Angular4.x + ionic3.x + cordova 項目運行: 項目名:[A Ionic3.x project],Ionic3.x的移動APP demo。 1. 如何運行 node版本 1.1 開發環境配置 1.2 開 ...
  • 介紹 口袋翻譯 口袋翻譯 微信小程式 翻譯功能 含7類語言的相互翻譯 包含最近10條的翻譯歷史回溯功能 微信搜索:簡e翻譯 功能展示 使用百度翻譯api需要申請 appid 與 key 併在 api.js 設置 項目相關 index 頁 navigator navigator 等同於 a鏈接,通過n ...
  • //調用 const transform = prefixStyle('transform') const backdrop = prefixStyle('backdrop-filter') div.style[transform] = `translate3d(0,0,0)` 等同於 div.st ...
  • CSS的四種引用方式: 1、行內樣式、內聯樣式 2、內嵌樣式、內部樣式 3、鏈接樣式 4、導入樣式 行內樣式 、內聯樣式 行內樣式是最簡單的一種css(Cascading Style Sheets【層疊樣式表】)使用方式,就是在html標簽中使用style屬性添加CSS樣式。 例如: <p styl ...
  • 近期已朋友問我問題,實現類似淘寶百度的下啦搜索條,看了網上好多帖子,都看起來好複雜,而且引用了好多沒用的東西,而且多選選擇內容多之後容易樣式奔潰, 無奈之下只好自己改了, 話不多說上效果圖: 模糊搜索廣會自動補全所有帶廣的下拉選項.每個選中的可以單獨刪除. 大神勿噴,給需要的朋友個幫助,話不多說,上 ...
  • 一、安裝NPM 1.1最新穩定版本: npm install vue 二、命令行工具安裝 國內速度慢,使用淘寶鏡像: npm install -g cnpm --registry=https://registry.npm.taobao.org 註意:以後使用npm的地方就替換成cnpm 1、全局安裝 ...
  • Angular新建項目步驟記錄 標簽(空格分隔): Angular 1. 2. 啟動dev環境 3. 修改 為`styles.scss`,同時修改文件 .angular cli.json 中的: 重新打包。 4. 配置全局樣式 /src 目錄下添加 文件夾 /scss 目錄下添加 ,`./utili ...
  • 一、初始JavaScript 二、瀏覽器的組成 2008年Google發佈了Chrome,它是採用優化後的js引擎,引擎代號V8,因能把js代碼直接轉化成機械碼0101來執行,進而以速度快而聞名。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...