1. 程式人生 > >前端上傳多張圖片並壓縮

前端上傳多張圖片並壓縮

html:

<input type="file" id="choose" accept="image/*" multiple>   //multiple屬性允許上傳多張

js:

$("#choose").change(function() { // 上傳事件觸發
if (!this.files.length) return; // this.files獲取上傳圖片
var files = Array.prototype.slice.call(this.files); // 轉換為陣列
files.forEach(function(file, i) { // 圖片檔案迴圈
if (!/\/(?:jpeg|png|gif)/i.test(file.type)) return; // file.type獲取圖片格式
var reader = new FileReader(); // FileReader
var li = document.createElement("li");// 物件允許Web應用程式非同步讀取儲存在使用者計算機上的檔案(或原始資料緩衝區)的內容
var size = file.size / 1024 > 1024 ? (~~(10 * file.size / 1024 / 1024)) / 10 + "MB" : ~~(file.size / 1024) + "KB";//file.size圖片大小,~~轉換數字整形
li.innerHTML = '<div class="img"><img src=""/></div>';
var i;
i++;
$(".img-list").prepend($(li)); //圖片顯示頁面上
reader.onload = function() { //讀取操作成功
var result = this.result; //檔案內容,讀取操作完成後,此屬性才有效
var img = new Image(); //Image物件
img.src = result;
$(li).find('img').attr('src', result);
//如果圖片大小小於100kb,則直接上傳
  if(result.length <= 100*1024) {//圖片小於100kb直接上傳
  img = null;
  // upload(result, file.type, $(li));
  return;
  }
  if(img.complete) { //影象在瀏覽器載入完成
  callback();
  } else {
  img.onload = callback; //當影象裝載完畢
  }
 
  function callback() {
  var data = compress(img);//進行壓縮操作
  upload(data, file.type, $(li));
  img = null;
  }
};
reader.readAsDataURL(file); //讀取file物件
})
});


function compress(img) {
var canvas = document.createElement("canvas"); //新建畫布
var ctx = canvas.getContext('2d'); //指定二維繪圖
var initSize = img.src.length;
var width = img.width;
  var height = img.height;
 
  var ratio;
  if((ratio = width * height / 400000) > 1) { //圖片大小大於40w畫素則進行壓縮
  ratio = Math.sqrt(ratio); //返回正平方根double值
  width /= ratio;
  height /= ratio;
  } else {
  ratio = 1;
  }
  canvas.width = width;
  canvas.height = height;
  ctx.fillStyle = "#fff"; //鋪底色
  ctx.fillRect(0, 0, canvas.width, canvas.height); //繪製“被填充”矩形
//如果圖片畫素大於100萬則使用瓦片繪製
  var count;
  if((count = width * height / 100000) > 1) {
var tCanvas = document.createElement("canvas");
var tctx = tCanvas.getContext("2d");
  count = ~~(Math.sqrt(count) + 1); //計算要分成多少塊瓦片
  //計算每塊瓦片的寬和高
  var nw = ~~(width / count);
  var nh = ~~(height / count);
  tCanvas.width = nw;
  tCanvas.height = nh;
  for(var i = 0; i < count; i++) {
  for(var j = 0; j < count; j++) {
  tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
  ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
  }
  }
  } else {
  ctx.drawImage(img, 0, 0, width, height);
  }
 
    //進行最小壓縮
  var ndata = canvas.toDataURL('image/jpeg', 0.1); //返回包含圖片展示的 data URI 第二個引數標識圖片質量
  tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
  return ndata;
}

相關推薦

前端圖片壓縮

html:<input type="file" id="choose" accept="image/*" multiple>   //multiple屬性允許上傳多張js:$("#choose").change(function() { // 上傳事件觸發if (

formdata圖片顯示

js function upImg(){ formData.append('state', 0); formData.append('type', 0); $.ajax({ url: "http://192.168.1.61:

前端圖片,編譯發給後端

今天分享一個找上傳多張圖片的方法,使用於網頁,移動端。 HTML頁面 <fieldset>   <legend>瀏覽圖片檔案:</legend>   <input type='file' name='fleUpload' id='f

SSM框架---圖片到專案資料夾內,圖片的路徑存到資料庫

資料庫:所存的圖片路徑可以為空,不確定要上傳幾張圖片,圖片id自增 spring配置檔案裡配置檔案上傳解析器  <bean id="multipartResolver" class="org.springframework.web.multipart.commons

如何用input標簽圖片回顯

poi 標簽設置 技術分享 chan load 記錄 input 為我 獲得 本文主要記錄如何用input標簽和jquery實現多圖片的上傳和回顯,不會涉及後端的交互,大概的效果看圖 我們從零來做一個這樣的demo 第一步: 我們先完善一下我們的頁面,默認的input-f

三十一、小程序圖片帶參數

默認 inf led export EDA sed 預覽圖 態度 alt WXML <view class=‘right‘> <view class="parcel" wx:for="{{pics}}" wx:key="{{index}}

Selenium如何圖片

這個是在本人的自動化測試專案中遇到的問題,本來就是一個簡單的上傳圖片的問題。分為上傳一張圖片和多張圖片,在這個測試專案中多張圖片限制為三張圖片 一張圖片: 三張圖片: 在此說一下我的心路歷程,一張圖片的上傳用了兩種方法均可以。 一種直接用sendkeys方法上傳

使用fckeditor圖片

流程: 1.使用fck上傳圖片到後臺 2.後臺上傳圖片到伺服器端 3.伺服器端返回上傳資訊 1.jsp頁面 <script type="text/javascript"> $(function(){ var tObj; $("#tabs a").each(funct

圖片(圖片)

頁面展示:點選連結檢視圖片(用到了jstl外掛) jsp頁面: <LINK href="${basePath}plugins/uploadify/uploadify.css" type="text/css" rel="stylesheet" /> <script langua

ajax 同時圖片

我用下文所示程式碼書寫時,似乎一次只傳一張 var formData = new FormData(); formData.append('file', $('#file1')[0].files[0]); formD

微信小程式開發(5)——圖片

上傳圖片的流程是:本地將圖片上傳到——》微信臨時伺服器,能夠返回臨時圖片檔案地址——》再將臨時圖片檔案地址傳輸給服務端——》服務端從微信伺服器上下載臨時圖片檔案儲存在服務端上 這個流程有點繞,花了點時間,踩了幾腳坑才成功。 1.圖片選擇框 <view class=

次點選file,資訊儲存在js集合中,不覆蓋上次點選資訊,js圖片

頁面只有一個input file按鈕,一個確認上傳按鈕,要求:多次點選上傳,吧圖片資訊儲存入集合,點選確認按鈕,上傳所有圖片 多次點選這一個按鈕上傳圖片,在js中儲存為集合,但是遇到一個問題,當我點選第二次的時候,傳過來的this資訊會頂替掉上一次的this資訊, 也就是:上傳兩次,集合中有

vue實現星級評價及圖片等功能(類似淘寶商品評價頁面)

最近在寫一個關於vue的商城專案,然後整合在移動端中,開發需求中有一介面,類似淘寶商城評價介面!實現效果圖如下所示: 評價頁 點選看大圖,且可左右滑動 功能需求分析 預設為5顆星,為非常滿意,4顆滿意,根據不同星級顯示不同滿意程度。 2.評價內容,最

關於php圖片時,選擇圖片後就可以預覽的問題

這幾天一直在解決一個問題,上傳圖片時選擇成功後就能預覽。 需求:在點選上傳圖示的時候會在前面的input框中顯示出檔名,然後點選後面的檢視按鈕就可以預覽選擇的這張圖片了,要求不能重新整理頁面 1.一開始的時候打算用ajax上傳,後來發現多張圖片一同上傳的時候會出現問題,a

非同步圖片外掛

效果展示:-》功能描述:    1.實現圖片預覽,預覽圖片移除,任意張數非同步上傳,上傳進度條指示,已選中且上傳的圖片不會重複上傳,且不能移除使用方法:        介面頂部引入IMGUP.css,2.0版本以下的Jquery,頁面底部引入IMGUP.js        介

struts2圖片的方法

原文地址 package eao; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; imp

java圖片,並且可以刪除圖片

如果你想只上傳一張圖片:http://blog.csdn.net/xuanzhangran/article/details/54928997 上傳多張: 可以刪除從庫裡查詢出來的圖片,也可以刪除剛上傳到圖片,其實不多,為了任務請耐心看完: 效果如下: 1

vue+element圖片圖片展示

前端: 檔案上傳使用el-upload <el-upload :http-request="uploadProductPic" accept="image/*" list-type="picture-card" :on-preview="handleContImgPrevi

微信小程式圖片

開發微信小程式應用中有個需求就是客戶評價和下工單,這裡都會用到上傳多張圖,在之前寫的一篇部落格關於微信小程式上傳多張圖線下測試還可應用但是線上不可以,查詢原因是因為執行緒的原因所以會用到遞迴的方法解決。 首先在app.js 中定義一個方法 uploadimg:func

關於實現微信小程式一次性圖片所遇到問題的解決方案

/** * 圖片上傳 * * @return * @throws Exception */ //@ExcLoginInterceptor 自定義的攔截器註解 @RequestMapping(value = "/upload",produces