前端壓縮上傳圖片

来源:https://www.cnblogs.com/cheee/archive/2019/05/14/10860638.html
-Advertisement-
Play Games

1 2 3 4 5 6 前端壓縮上傳圖片 7 8 9 10 11 12 13 121 122 123 ...


  1 <!DOCTYPE html>
  2 <html>
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <title>前端壓縮上傳圖片</title>
  7     <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
  8 </head>
  9 
 10 <body>
 11     <input type="file" id="picFile" onchange="readFile(this)" />
 12     <img id="img" src="" alt="" />
 13     <script>
 14         function readFile(obj) {
 15             var file = obj.files[0];
 16             //判斷類型是不是圖片 
 17             if (!/image\/\w+/.test(file.type)) {
 18                 alert("請確保文件為圖像類型");
 19                 return false;
 20             }
 21             var reader = new FileReader();
 22             reader.readAsDataURL(file);
 23             reader.onload = function(e) {
 24                 dealImage(this.result, { quality: 0.5 }, function(base) {
 25                     //調用
 26                     var blob = dataURLtoBlob(base);
 27                     var newFile = new File([blob], file.name, { type: file.type });
 28                     console.log(newFile)
 29 
 30                     let r = new FileReader(); //本地預覽
 31                     r.onload = function() {
 32                         $('#img').attr("src", r.result);;
 33                     }
 34                     r.readAsDataURL(newFile); //Base64
 35 
 36                     // upload(newFile);
 37                 });
 38             }
 39         }
 40 
 41         //將base64轉換為blob
 42         function dataURLtoBlob(dataurl) {
 43             var arr = dataurl.split(','),
 44                 mime = arr[0].match(/:(.*?);/)[1],
 45                 bstr = atob(arr[1]),
 46                 n = bstr.length,
 47                 u8arr = new Uint8Array(n);
 48             while (n--) {
 49                 u8arr[n] = bstr.charCodeAt(n);
 50             }
 51             return new Blob([u8arr], { type: mime });
 52         }
 53 
 54 
 55         function upload(file) {
 56             var that = this;
 57             // 創建form對象
 58             let param = new FormData();
 59             // 通過append向form對象添加數據
 60             param.append('img', file);
 61             // 文件大小
 62             param.append('size', file.size);
 63             for (var n in that.params) {
 64                 param.append(n, that.params[n]);
 65             }
 66             
 67             // 創建ajax
 68             var xhr = new XMLHttpRequest();
 69 
 70             xhr.onload = function() {
 71                 console.log(xhr.responseText)
 72             }
 73             xhr.open("POST", "yourapi", true);
 74 
 75             // 發送表單數據
 76             xhr.send(param);
 77         }
 78         /**
 79          * 圖片壓縮,預設同比例壓縮
 80          * @param {Object} path
 81          * pc端傳入的路徑可以為相對路徑,但是在移動端上必須傳入的路徑是照相圖片儲存的絕對路徑
 82          * @param {Object} obj
 83          * obj 對象 有 width, height, quality(0-1)
 84          * @param {Object} callback
 85          * 回調函數有一個參數,base64的字元串數據
 86          */
 87         function dealImage(path, obj, callback) {
 88             var img = new Image();
 89             img.src = path;
 90             img.onload = function() {
 91                 var that = this;
 92                 // 預設按比例壓縮
 93                 var w = that.width,
 94                     h = that.height,
 95                     scale = w / h;
 96                 w = obj.width || w;
 97                 h = obj.height || (w / scale);
 98                 var quality = obj.quality || 0.7; // 預設圖片質量為0.7
 99                 //生成canvas
100                 var canvas = document.createElement('canvas');
101                 var ctx = canvas.getContext('2d');
102                 // 創建屬性節點
103                 var anw = document.createAttribute("width");
104                 anw.nodeValue = w;
105                 var anh = document.createAttribute("height");
106                 anh.nodeValue = h;
107                 canvas.setAttributeNode(anw);
108                 canvas.setAttributeNode(anh);
109                 ctx.drawImage(that, 0, 0, w, h);
110                 // 圖像質量
111                 if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
112                     quality = obj.quality;
113                 }
114                 // quality值越小,所繪製出的圖像越模糊
115                 var base64 = canvas.toDataURL('image/jpeg', quality);
116                 // 回調函數返回base64的值
117                 callback(base64);
118             }
119         }
120     </script>
121 </body>
122 
123 </html>

 


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

-Advertisement-
Play Games
更多相關文章
  • 防抖和節流,主要是用來防止過於平凡的執行某個操作,如瀏覽器視窗變化執行某個操作,監聽某個input輸入框keyup變化,瀑布流佈局時Y軸滾動,圖片載入。 js函數的防抖 經過一段事件才執行某個操作,如果時間內又執行了該操作則延長時間重新開始計算 /* 輸入快的話會出現輸出結果多次重覆 */ 使用防抖 ...
  • 一、函數: 1、函數就是一個工具,通過一小段代碼,完成某個功能; 2、函數的定義: 或者 : 3、函數的調用(可以在函數定義後調用): 函數名(); 4、函數的參數: ①、形式參數: 形參出現在函數定義中,必須是變數。 ②、實際參數: 實參出現在函數調用中,可以是常量、變數、表達式,必須有值; (實 ...
  • 模擬器名稱 連接預設埠夜神安卓模擬器夜神安卓模擬器 62001逍遙安卓模擬器逍遙安卓模擬器 21503BlueStacks(藍疊安卓模擬器)BlueStacks(藍疊安卓模擬器) 5555雷電安卓模擬器雷電安卓模擬器 5555天天安卓模擬器天天安卓模擬器 5037網易MuMu(安卓模擬器)網易Mu ...
  • 今天我們將利用vue的條件指令來完成一個簡易的動態變色功能按鈕 首先我們還是要對vue進行配置,在上篇隨筆中有相關下載教學. 然後我們要在html頁面上搭建三個簡易的按鈕,顏色分別為紫,綠和藍(顏色隨意)其代碼如下: 這裡的@是v-on事件指令,在這裡要在三個按鈕上設置點擊事件 接著我們要進行條件指 ...
  • nodejs版本:v10.14.2 1.首先準備一個簡單的html頁面 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>nodejs顯示html</title> 6 </head> 7 < ...
  • 典型的一個Web應用的生命周期從用戶在瀏覽器輸入一串URL,或者單擊一個鏈接開始(就是訪問一個頁面)。而這個生命周期的結束就是我們關閉這個頁面。 響應流程: 例子(本例來自《javascript:忍者秘籍》) HTML: javascript: ...
  • 1、viewer.js 使用 Demo http://fengyuanchen.github.io/viewerjs/ 2、viewer.js 下載地址 https://github.com/fengyuanchen/viewerjs 3、viewer只能初始化一次,也就是說如果用ajax添加了新的 ...
  • ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...