html5實(shí)現(xiàn)圖片預(yù)覽和查看原圖

html5從一開(kāi)始就給開(kāi)發(fā)者很多的期待墩莫,提供眾多新的API翅敌,不用再想以前一樣羞福,為了實(shí)現(xiàn)某個(gè)功能寫很多的代碼。在以前蚯涮,如果要實(shí)現(xiàn)圖片預(yù)覽會(huì)怎么做呢治专,因?yàn)闉榱税踩脑颍瑆eb端的js是不能讀取文件的本地真實(shí)路徑的遭顶,那么只能將圖片上傳到服務(wù)器上张峰,然后再拿到圖片的鏈接,這樣才能實(shí)現(xiàn)圖片預(yù)覽棒旗。而服務(wù)器呢喘批,比如有兩個(gè)文件夾,一個(gè)是臨時(shí)文件夾铣揉,一個(gè)是正式文件夾饶深,臨時(shí)文件夾會(huì)定時(shí)進(jìn)行清理,正式文件夾是用戶確認(rèn)使用的圖片存儲(chǔ)的位置逛拱。

1. fileReader

現(xiàn)在html5提供的API不再讓圖片預(yù)覽那么麻煩敌厘,F(xiàn)ileReader提供了很多的方法來(lái)進(jìn)行圖片預(yù)覽和文本讀取,同時(shí)也提供了一整套完整的事件來(lái)捕獲文件的狀態(tài)朽合,如下:

FileReader接口的方法 FileReader接口有4個(gè)方法俱两,其中3個(gè)用來(lái)讀取文件,另一個(gè)用來(lái)中斷讀取曹步。無(wú)論讀取成功或失敗宪彩,方法并不會(huì)返回讀取結(jié)果,這一結(jié)果存儲(chǔ)在result屬性中箭窜。

方法名 參數(shù) 描述
readAsBinaryString file 將文件讀取為二進(jìn)制編碼
readAsText file[, encoding] 按照格式將文件讀取為文本毯焕,encode默認(rèn)為UTF-8
readAsDataURL file 將文件讀取為DataUrl
abort (none) 終端讀取操作

FileReader接口事件 FileReader接口包含了一套完整的事件模型,用于捕獲讀取文件時(shí)的狀態(tài)磺樱。

事件 描述
onabort 中斷
onerror 出錯(cuò)
onloadstart 開(kāi)始
onprogress 正在讀取
onload 成功讀取
onloadend 讀取完成纳猫,無(wú)論成功失敗

2. 使用fileReader讀取圖片

從上面的表格中,我們可以大致了解fileReader提供哪些方法和事件竹捉,不過(guò)本文主要是講解圖片的讀取芜辕,那么我們就是用readAsDataURL()就可以了。不過(guò)块差,在進(jìn)行這一切之前侵续,我們必須檢測(cè)當(dāng)前的瀏覽器是否支持html5的fileReader倔丈,別進(jìn)行了一系列的處理和操作,結(jié)果js報(bào)錯(cuò)状蜗,說(shuō)fileReader沒(méi)有定義需五。就好像對(duì)一個(gè)女孩兒又親又啃,馬上要提槍上馬了轧坎,結(jié)果發(fā)現(xiàn)這是個(gè)純爺們宏邮。

if(!(window.FileReader && window.File && window.FileList && window.Blob)){
    show.innerHTML = '您的瀏覽器不支持fileReader';
    upimg.setAttribute('disabled', 'disabled');
    return false;
}

好的,讓我們先看下demo演示:【狠狠點(diǎn)擊這里

2.1 讀取單張圖片

使用input[type=file]控件讀取文件缸血,然后監(jiān)聽(tīng)這個(gè)控件的change事件蜜氨,若讀取的文件個(gè)數(shù)大于零,那么就進(jìn)行下一步的操作:

<input type="file" id='upimg' />
var upimg = document.querySelector('#upimg');
upimg.addEventListener('change', function(e){
    var files = this.files;
    if(files.length){
        // 對(duì)文件進(jìn)行處理捎泻,下面會(huì)講解checkFile()會(huì)做什么
        checkFile(this.files);
    }
});

現(xiàn)在我們只能選取一張圖片飒炎,針對(duì)選取的這張圖片,我們使用fileReader進(jìn)行圖片的處理

// 圖片處理
function checkFile(files){
    var file = files[0];
    var reader = new FileReader();
    // show表示<div id='show'></div>笆豁,用來(lái)展示圖片預(yù)覽的
    if(!/image\/\w+/.test(file.type)){
        show.innerHTML = "請(qǐng)確保文件為圖像類型";
        return false;
    }
    // onload是異步操作
    reader.onload = function(e){
        show.innerHTML = '<img src="'+e.target.result+'" alt="img">';
    }
    reader.readAsDataURL(file);
}

現(xiàn)在郎汪,就可以在頁(yè)面上看到圖片了。審查元素后我們能夠看到闯狱,圖片地址是個(gè)base64的字符串怒竿,如:’data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sA……’

2.2 讀取多張圖片

多張圖片和單張圖片的處理過(guò)程很相似,但是也還是有區(qū)別的扩氢,因?yàn)閞eader.onload()是一個(gè)異步的操作耕驰,進(jìn)行下一步的操作時(shí)必須在這個(gè)方法里

<input type="file" id='upimg' multiple />
// change事件沒(méi)有改動(dòng)
// 圖片處理
function checkFile(files){
    var html='', i=0;
    var func = function(){
        if(i>=files.length){
            // 若已經(jīng)讀取完畢,則把html添加頁(yè)面中
            show.innerHTML = html;
        }
        var file = files[i];
        var reader = new FileReader();

        // show表示<div id='show'></div>录豺,用來(lái)展示圖片預(yù)覽的
        if(!/image\/\w+/.test(file.type)){
            show.innerHTML = "請(qǐng)確保文件為圖像類型";
            return false;
        }
        reader.onload = function(e){
            html += '<img src="'+e.target.result+'" alt="img">';
            i++;
            func(); //選取下一張圖片
        }
        reader.readAsDataURL(file);
    }
    func();
}

2.3 拖拽拉取圖片

拖拽事件朦肘,采用的是html5中的drag和drop,本文不著重介紹這兩個(gè)方法双饥,僅僅是講解如何使用媒抠。

首先,我們?cè)O(shè)置一塊拖拽區(qū)域咏花,告訴用戶應(yīng)該把圖片拖拽到什么位置:

<style>
    .drag{ width: 400px;height: 100px;border: 1px dotted #333; text-align: center; line-height: 100px; color: #aaa; display: inline-block;}
    .drag_hover{background: #FAD6F9;}
</style>
<span class='drag' id="drag">拖拽區(qū)域</span>

然后趴生,我們給drag區(qū)域綁定上拖拽事件

var drag = document.getElementById('drag');
drag.addEventListener('dragenter', function(e){
    // 拖拽鼠標(biāo)進(jìn)入?yún)^(qū)域時(shí)
    this.className = 'drag_hover';
}, false);
drag.addEventListener('dragleave', function(e){
    // 拖拽鼠標(biāo)離開(kāi)區(qū)域時(shí)
    this.className = '';
}, false);
drag.addEventListener('drop', function(e){
    // 當(dāng)鼠標(biāo)執(zhí)行‘放’的動(dòng)作時(shí),執(zhí)行讀取文件操作
    var files = e.dataTransfer.files;
    this.className = '';
    if (files.length != 0) {
        checkFile(files);
    };
    e.preventDefault();
}, false)
drag.addEventListener('dragover', function(e){
    // 當(dāng)對(duì)象拖動(dòng)到目標(biāo)對(duì)象時(shí)觸發(fā)
    e.dataTransfer.dragEffect = 'copy';
    e.preventDefault();
}, false);

這里有個(gè)需要注意的地方:需要給dragover和drop添加阻止默認(rèn)事件昏翰,否則瀏覽器會(huì)采用file:///的方式打開(kāi)文件苍匆。drop事件執(zhí)行后就是進(jìn)行checkFile(),后續(xù)的操作與使用input[type=file]的操作一樣棚菊。

3. 點(diǎn)擊查看原圖

當(dāng)我們點(diǎn)擊圖片查看原圖時(shí)浸踩,需要知道圖片的原始尺寸⊥城螅可能你會(huì)想到使用img.width和img.height检碗,對(duì)据块,這個(gè)確實(shí)能獲取到圖片的長(zhǎng)和寬,但是折剃,這個(gè)長(zhǎng)和寬是經(jīng)過(guò)css修飾后的另假,不是圖片原始的尺寸。如果要獲取圖片的原始尺寸怕犁,我們可以在js中創(chuàng)建一個(gè)imgs對(duì)象浪谴,然后把那張圖片的地址給了這個(gè)imgs對(duì)象,然后獲取imgs對(duì)象的尺寸因苹,這樣就能獲取到圖片的原始尺寸了。

var imgs = new Image();
imgs.src = img.src; // 給新的img對(duì)象鏈接
console.log(imgs.width, imgs.height);

而在html5中篇恒,我們不用再那么麻煩的創(chuàng)建一個(gè)無(wú)用的img對(duì)象了扶檐,直接使用給出的屬性即可胁艰。

console.log(img.naturalWidth);  // 獲取圖片的原始的寬度
console.log(img.naturalHeight); // 獲取圖片的原始的高度

獲取到圖片的原始尺寸后腾么,就能做出‘查看原圖’的效果了。

4. 總結(jié)

html5真是個(gè)好東西于宙,還有著很多的東西等著我們?nèi)ネ诰蚶敫馈宵蛀!败f騰吧宣吱,程序員”杭攻!

轉(zhuǎn)載自:http://www.xiabingbao.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锅睛,一起剝皮案震驚了整個(gè)濱河市望侈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秸苗,死亡現(xiàn)場(chǎng)離奇詭異惊楼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秸讹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門檀咙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人璃诀,你說(shuō)我怎么就攤上這事弧可。” “怎么了劣欢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棕诵,是天一觀的道長(zhǎng)裁良。 經(jīng)常有香客問(wèn)我,道長(zhǎng)校套,這世上最難降的妖魔是什么价脾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮笛匙,結(jié)果婚禮上侨把,老公的妹妹穿的比我還像新娘。我一直安慰自己妹孙,他們只是感情好秋柄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蠢正,像睡著了一般骇笔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上机隙,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音萨西,去河邊找鬼有鹿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谎脯,可吹牛的內(nèi)容都是我干的葱跋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼源梭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娱俺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起废麻,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荠卷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后烛愧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體油宜,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怜姿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慎冤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沧卢,死狀恐怖蚁堤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情但狭,我是刑警寧澤披诗,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布撬即,位于F島的核電站,受9級(jí)特大地震影響藤巢,放射性物質(zhì)發(fā)生泄漏搞莺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一掂咒、第九天 我趴在偏房一處隱蔽的房頂上張望才沧。 院中可真熱鬧,春花似錦绍刮、人聲如沸温圆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岁歉。三九已至,卻和暖如春膝蜈,著一層夾襖步出監(jiān)牢的瞬間锅移,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工饱搏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留非剃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓推沸,卻偏偏與公主長(zhǎng)得像备绽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鬓催,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一肺素、前言 這兩天恰好有一位同事問(wèn)我怎樣做一個(gè)圖片預(yù)覽功能。作為現(xiàn)代人的我們首先想到的當(dāng)然是HTML5啦宇驾,其實(shí)HTM...
    東野文然閱讀 1,124評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,525評(píng)論 25 707
  • 轉(zhuǎn)載請(qǐng)聲明 原文鏈接 關(guān)注公眾號(hào)獲取更多資訊 這篇文章主要總結(jié)H5的一些新增的功能以及一些基礎(chǔ)歸納倍靡,這里只是一個(gè)提...
    程序員poetry閱讀 9,062評(píng)論 22 225
  • 人人都在渴望幸福,人人都在感受幸福课舍。幸福有時(shí)很抽象菌瘫,有時(shí)很具體。幸福有時(shí)很遙遠(yuǎn)布卡,有時(shí)近在咫尺雨让。奉獻(xiàn)是幸福,給予是幸...
    瘋子Selina閱讀 177評(píng)論 0 0
  • 突然安靜下來(lái)忿等,好像有些不知所措栖忠。詩(shī)和遠(yuǎn)方,太美好太遙不可及。大概唯一能觸碰的就是當(dāng)下了庵寞。想要做個(gè)腹有詩(shī)書(shū)氣自華的女...
    BQdleking閱讀 311評(píng)論 1 0