1. 程式人生 > >js上傳圖片處理:壓縮,旋轉校正圖片

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、根據圖片大小進行判斷是否需要壓縮

1988

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:圖片預覽(inputtype="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