js上傳圖片處理:壓縮,旋轉校正圖片
隨著科技發展的浪潮,手機上的攝像機的畫素越來越高,成像的效果也越來越好。到現在一張手機拍攝的圖片在 2M 左右是很正常的。在實際的應用場景中經常需要使用者上傳圖片這樣的人機互動方式。為了提高使用者體驗,上傳圖片之前要進行壓縮。部分手機拍攝的圖片會帶有拍攝方向(如魅族,蘋果),在上傳之前就需要進行圖片修正。案例中使用了 html5 的一些 API 對圖片進行壓縮; exif.js 的 EXIF.getDate(image, callback) API 獲取圖片的拍攝方向判斷校正。
exif.js 相關資料:
https://github.com/exif-js/exif-js
http://code.ciaoca.com/javascript/exif-js/
1、新增 change 監聽事件。當用戶選擇好圖片後,使用 FileReader 讀取圖片檔案。
2、獲取到圖片後使用 exif.js 的 EXIF.getDate(image, callback) API 獲取圖片的拍攝方向,根據拍攝方向進行不同角度的旋轉
3、根據圖片大小進行判斷是否需要壓縮
html DEMO:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<script src="jquery-3.1.0.min.js"></script>
<script src="exif.js"></script>
<script src="image.js"></script>
</head>
<body>
<form>
<input id="image" type="file" accept="*">
</form>
<div id="show"></div>
</body>
<script >
$(function () {
var async = {};
//處理圖片後進行的操作,如上傳
async.do = function () {
var imageData = $('#show>img')[0].src;//獲取base64格式的圖片
var imageData = imageData.replace(/data:image\/jpeg;base64,/,'');//去掉"data:image/jpeg;base64,"
//上傳圖片
$.post('getImage.php',{image:imageData,lrj:'hhh'},function (data) {
console.log(data)
})
};
var source = $('#image');
var show = $('#show')
imageProcess(source, show, async)
})
</script>
</html>
圖片質量對比
image.js:
/**
* Created by ROOT on 2016/12/14.
*/
/**
* @param source 圖片源的表單
* @param show 要展示圖片的div
* @param async 圖片處理完成後要進行的操作,如ajax上傳。等資訊
*/
function imageProcess(source,show,async) {
//監聽圖片源表單的改變事件
source.change(function () {
var files = this.files;
if(files.length){
var isImage = checkFile(this.files);
if(!isImage){
show.html("請確保檔案為影象型別");
}else{
var reader = new FileReader();
reader.onload = function(e){
var imageSize = e.total;//圖片大小
var image = new Image();
image.src = e.target.result;
image.onload = function () {
// 旋轉圖片
var newImage = rotateImage(image)
// console.log(newImage)
//壓縮圖片
newImage = judgeCompress(newImage,imageSize);
newImage.setAttribute('width','100%');
show.html(newImage);
async.do();
}
}
reader.readAsDataURL(isImage);
}
}
})
}
/**
* 檢查檔案是否為影象型別
* @param files FileList
* @returns file File
*/
function checkFile(files){
console.log(files)
var file = files[0];
//使用正則表示式匹配判斷
if(!/image\/\w+/.test(file.type)){
return false;
}
return file;
}
/**
* 判斷圖片是否需要壓縮
* @param image HTMLImageElement
* @param imageSize int
* @returns {*} HTMLImageElement
*/
function judgeCompress(image,imageSize) {
//判斷圖片是否大於300000 bit
var threshold = 300000;//閾值,可根據實際情況調整
console.log('imageSize:'+imageSize)
if(imageSize>threshold){
var imageData = compress(image);
var newImage = new Image()
newImage.src = imageData
return newImage;
}else {
return image;
}
}
/**
*壓縮圖片
* @param image HTMLImageElement
* @returns {string} base64格式影象
*/
function compress(image) {
console.log('compress');
console.log(image)
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d');
var imageLength = image.src.length;
var width = image.width;
var height = image.height;
canvas.width = width;
canvas.height = height;
ctx.drawImage(image, 0, 0, width, height);
//壓縮操作
var quality = 0.1;//圖片質量 範圍:0<quality<=1 根據實際需求調正
var imageData = canvas.toDataURL("image/jpeg", quality);
console.log("壓縮前:" + imageLength);
console.log("壓縮後:" + imageData.length);
console.log("壓縮率:" + ~~(100 * (imageLength - imageData.length) / imageLength) + "%");
return imageData;
}
/**
* 旋轉圖片
* @param image HTMLImageElement
* @returns newImage HTMLImageElement
*/
function rotateImage(image) {
console.log('rotateImage');
var width = image.width;
var height = image.height;
var canvas = document.createElement("canvas")
var ctx = canvas.getContext('2d');
var newImage = new Image();
//旋轉圖片操作
EXIF.getData(image,function () {
var orientation = EXIF.getTag(this,'Orientation');
// orientation = 6;//測試資料
console.log('orientation:'+orientation);
switch (orientation){
//正常狀態
case 1:
console.log('旋轉0°');
// canvas.height = height;
// canvas.width = width;
newImage = image;
break;
//旋轉90度
case 6:
console.log('旋轉90°');
canvas.height = width;
canvas.width = height;
ctx.rotate(Math.PI/2);
ctx.translate(0,-height);
ctx.drawImage(image,0,0)
imageDate = canvas.toDataURL('Image/jpeg',1)
newImage.src = imageDate;
break;
//旋轉180°
case 3:
console.log('旋轉180°');
canvas.height = height;
canvas.width = width;
ctx.rotate(Math.PI);
ctx.translate(-width,-height);
ctx.drawImage(image,0,0)
imageDate = canvas.toDataURL('Image/jpeg',1)
newImage.src = imageDate;
break;
//旋轉270°
case 8:
console.log('旋轉270°');
canvas.height = width;
canvas.width = height;
ctx.rotate(-Math.PI/2);
ctx.translate(-height,0);
ctx.drawImage(image,0,0)
imageDate = canvas.toDataURL('Image/jpeg',1)
newImage.src = imageDate;
break;
//undefined時不旋轉
case undefined:
console.log('undefined 不旋轉');
newImage = image;
break;
}
}
);
return newImage;
}
getImage.php:
<?php
/**
* Created by PhpStorm.
* User: 6500
* Date: 2017/4/5
* Time: 18:10
*/
$imagePath = './uploadPicture.jpg';//圖片儲存路徑
$image = base64_decode($_POST['image']);
$newFile = fopen($imagePath,'w');
$fwriteRes = fwrite($newFile,$image);
fclose($newFile);
if ($fwriteRes){
echo 'success';
}
相關推薦
js上傳圖片處理:壓縮,旋轉校正圖片
隨著科技發展的浪潮,手機上的攝像機的畫素越來越高,成像的效果也越來越好。到現在一張手機拍攝的圖片在 2M 左右是很正常的。在實際的應用場景中經常需要使用者上傳圖片這樣的人機互動方式。為了提高使用者體驗,上傳圖片之前要進行壓縮。部分手機拍攝的圖片會帶有拍攝方向(如
html5+exif.js+canvas實現手機端照片上傳預覽、壓縮、旋轉功能
html5+canvas進行移動端手機照片上傳時,發現ios手機上傳豎拍照片會逆時針旋轉90度,橫拍照片無此問題;Android手機沒這個問題。 因此解決這個問題的思路是:獲取到照片拍攝的方向角,對非橫拍的ios照片進行角度旋轉修正。 利用exif.js讀取照片的拍攝資訊
.Net上傳檔案處理三大正規化,及開發注意事項
最近工作內容涉及到一點前端的內容,把學習到的內容記錄下來,在今後的開發過程中,不要犯錯。本篇只針對一些剛入職的小白及前端開發人員,大牛請繞道!~ 剛開始我們先不講上傳檔案的防範問題,先通過一個例子,讓大家瞭解其中的危害。 先給大家看一個簡單的頁面,細心的小夥伴已經發現了,這個上傳的按鈕是禁用狀
微信js上傳圖片並 展示,iphone下預覽
https useragent 預覽圖 shang 服務器 fun 相冊 put 相機 $(‘.addphotos‘).click(function(){ var that = $(this);
多次點選file上傳,資訊儲存在js集合中,不覆蓋上次點選資訊,js上傳多張圖片
頁面只有一個input file按鈕,一個確認上傳按鈕,要求:多次點選上傳,吧圖片資訊儲存入集合,點選確認按鈕,上傳所有圖片 多次點選這一個按鈕上傳圖片,在js中儲存為集合,但是遇到一個問題,當我點選第二次的時候,傳過來的this資訊會頂替掉上一次的this資訊, 也就是:上傳兩次,集合中有
JS:上傳時圖片預覽(input:type="file" :)
一、準備工作 1.預設素材:Img_add.png 2 使用window.FileReader :預覽 二、以預設圖片覆蓋input:type="file"元素。瀏覽圖片,實現預覽 <!doctype html> <html> <he
kindeditor編輯器圖片上傳自動加alt屬性,請看:
kindeditor上傳本地圖片圖片說明是怎麼新增到文字編輯器的alt裡面的,程式設計師人生工程師為大家詳細說明下,怎麼實現這個功能。 目標分析:上傳本地圖片,可以預設直接將標題內容作為圖片的title和alt屬性,並且此時是可以修改圖片說明屬性的,效果圖如下
js 上傳圖片並轉為base64編碼+預覽圖片+壓縮
js 上傳圖片並轉為base64編碼+預覽圖片+壓縮 html部分 <div id="adds" class="fix"> <form id="myForm" class="clearfix left" name="myForm"> <div clas
【JS】封裝相容正版IE9的上傳控制元件,支援圖片格式,圖片大小,圖片寬高驗證,支援非圖片樣式
先廢話一小段,大家好,本人首篇處女作,為什麼要實現一個上傳控制元件呢,必然是公司需要嘛,實現整個過程挺揪心的,因為要解決ie9這個相容性問題,整體來說我前後用了五天的時間來實現。依賴了jquery,其實也可以使用原生編寫,不過想偷偷懶,公司也推薦使用jquery。因為是第一次
js上傳圖片,同時生成縮圖
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE&
移動端(h5)上傳,壓縮,預覽圖片
專案裡邊這次用到了移動端上傳圖片,拿出來分享下。 1.首先是思路,在input 發生change的時候判斷瀏覽器時候支援圖片預覽,支援的情況下校驗圖片的格式,圖片的大小,之後將拿到的圖片進行canvas壓縮,圖片轉base64,然後上傳。 2.程式碼
js上傳圖片預覽,php後臺接收例項,已改寫為多圖上傳預覽
上傳圖片預覽這個出自超實用的js程式碼段,關於圖片的處理那一章,php後臺接收是網上比較少這方面的資源或者寫得很複雜,這裡簡單記錄。都是基於js 首先先呼叫兩個資料夾animateManage.js和viewimg.js,可以在網上下載。相當好用。 關鍵點是FileRead
ajaxFileUpload.js上傳圖片外掛,全瀏覽器相容,規避json錯誤,帶檔案格式大小攔截
直接上程式碼了 有不理解的可以評論區@我 一起討論。 /* 2017/04/17-zhaoyf-ajaxFileUpload.js 無重新整理上傳圖片 jquery 外掛,支援 ie6-ie11 依賴:jquery.js 主方法:ajaxFileUpload 接受
通過圖片地址,將圖片處理成base64,使用ajax上傳圖片
需求 群裡的一個小朋友一直要求我幫他實現以下,我就寫了一個案例。需求就是,他用canvas生成了一個base64格式的圖片,然後需要將這個圖片上傳到伺服器上面去。 程式碼 <!doctype html> <html lang="en"
JS上傳圖片,利用canvas實現圖片壓縮
操作 base64 itob 思考 旋轉角度 基礎 inpu url 一位 項目中的一個基礎功能-----手機上傳圖片 技術棧: 1、利用canvas進行壓縮(這個應該都比較熟悉)2、利用exif-js獲取照片旋轉角度屬性,因為有些手機機型會因為拍照時手機的方向使拍的照片帶
HTML5 之圖片上傳預處理
context 處理 file url form view utf .get ctu <!DOCTYPE html><html lang="en"> <head> <title></title> <
js 上傳圖片本地預覽緩存
att 圖片 rip html ext set 設置圖 獲取文件 file <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>文件上傳&
springMVC圖片上傳的處理方式
com add turn subst cor input gif格式 abs value 首先需要依賴的jar包: <dependency> <groupId>commons-io</groupId> <artifactI
js上傳圖片
for 不顯示 tar eight gin 單個 ext idt 添加 註意:上傳文件一般使用的是input標簽,如果想要改樣式,讓input不顯示,可以把input標簽放入<leabel>標簽中,然後讓input標簽 display:none; 案例1:上傳單
js上傳文件(圖片)限制格式及大小為3M
max element 不能 jpg script 圖片大小 -s 打開 -1 本文保存為.html文件用瀏覽器打開即可測試功能 <form id="form1" name="form1" method="post" action="" enctype="m