日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript實現(xiàn)獲取圖片文件真實格式的示例代碼

瀏覽:333日期:2022-06-01 09:14:35
目錄
  • 常見方式判斷圖片格式
  • 圖像數(shù)據(jù)簡單說明
  • JS讀取圖片真實格式
    • svg格式的判斷
  • 總結

    前面博文有提到,當前主流瀏覽器能支持的圖片格式,是七種:jpg、png、gif、bmp、ico、webp、svg,其中,前六種都是位圖,svg則是唯一的矢量圖。

    每種格式的圖片,都有自己特有的優(yōu)缺點以及數(shù)據(jù)結構,本篇博文的目的就是基于不同格式的圖像二進制數(shù)據(jù),獲取到圖片的真實格式。

    常見方式判斷圖片格式

    當我們進行前端開發(fā),需要處理圖片上傳功能,針對圖片格式做判斷時,常規(guī)的方法都是使用文件后綴名來判斷,如下代碼所示:

    input.addEventListener("change", (e) => {  const file = e.target.files[0]  const format = file.name.substring(file.name.lastIndexOf(".") + 1).toLowerCase()}, false)

    以上代碼,監(jiān)聽上傳控件的事件,得到要上傳的文件信息,獲取文件名稱,然后通過獲取文件名稱截取文件后綴名,以后綴名作為圖片文件的格式。

    這段代碼,大部分人都比較熟悉,也有很多場景下是這樣來判斷圖片格式的,但如果我們強行修改了文件的后綴名,則此方法就失效了。

    我們知道gif格式圖片的位深度是8,如果我們強制把位深度為32的png格式的圖片后綴名改成gif,這個圖片文件依然可以正常使用:

    上圖所示,就是將png格式文件后綴名改成了gif,圖片系統(tǒng)信息顯示格式為gif,但是位深度還是32,圖像本質(zhì)上還是png格式的。

    這個時候,單純的通過后綴名來判斷圖片的格式,就不再準確了,我們需要另外的方式來獲取圖片文件的真實格式。而這種方式就需要使用到前端二進制相關的知識,見前文介紹深入理解前端字節(jié)二進制知識以及相關API。

    修改后綴名的方式

    • 幾種位圖格式之間,是可以相互修改后綴名,圖片仍能正常使用
    • gif動圖后綴名改成其他位圖格式,則動效會失效,變成靜態(tài)圖
    • 位圖格式的后綴名如果改成矢量圖svg,則圖片失效,將無法使用
    • svg圖片文件后綴名改成位圖格式,圖片也將無法使用

    圖像數(shù)據(jù)簡單說明

    不同格式的圖像所存儲的數(shù)據(jù)是不一樣的,都有自己特殊的數(shù)據(jù)結構。

    依據(jù)各個格式圖像不同的數(shù)據(jù)結構,我們通過類型數(shù)組中的圖像數(shù)據(jù),就能判斷出圖片的真實格式。

    • 如jpg格式,它的圖像數(shù)據(jù)結構中,最前面2個字節(jié)是一個固定取值 0xFFD8,第三個字節(jié)一般也是固定 0xFF
    • 如png格式,它的圖像數(shù)據(jù)結構中,最前面8個字節(jié)就是PNG文件署名域,可以很好的標識出當前圖像的格式就是PNG。
    • 如bmp格式,它的圖像數(shù)據(jù)結構中,最前面14個字節(jié)存儲的是文件頭信息,而最前面2個字節(jié)存儲的就是文件類型:BM
    • 如webp格式,需要從最前面移動8個字節(jié)以后,取接下來的4個字節(jié)的信息,代表文件類型:WEBP

    針對不同位圖的的數(shù)據(jù)判斷,可以使用下面表格列出的方式:

    格式標識的字節(jié)數(shù)對應的十進制值偏移量jpg3255 216 2550png8137 80 78 71 13 10 26 100gif371, 73, 700webp487, 69, 66, 808ico40, 0, 1, 00bmp266 770

    其中,偏移量為0,表示取最前面幾個字節(jié)的數(shù)據(jù);webp的偏移量為8,表示從最前面移動8個字節(jié)后,再取4個字節(jié)的標識符。

    上面的表格,已經(jīng)列出了當前瀏覽器支持的位圖圖像,字節(jié)判斷標識,通過讀取相應的數(shù)據(jù)做對比就得到了真實的格式。

    以上幾種格式中,bmp、gif、webp取到的數(shù)據(jù),都能對應各自特有的署名標識,前面有提到 BMWEBP,gif格式的則是 GIF。可以運用字符編碼方面的知識,如使用 String.fromCharCode 方法對數(shù)值進行轉(zhuǎn)換,具體的前端字符編碼知識見前文前端開發(fā)中需要搞懂的字符編碼

    // bmpString.fromCharCode(66) // BString.fromCharCode(77) // M// gifString.fromCharCode(71) // GString.fromCharCode(73) // IString.fromCharCode(70) // F// webpString.fromCharCode(87) // WString.fromCharCode(69) // EString.fromCharCode(66) // BString.fromCharCode(80) // P

    gif格式的署名標識是和版本號一起處理的,一般最前面6個字節(jié)標識: 'G'、'I'、'F'、'8'、'7(9)'、'a'。第5個字節(jié)可取值7或者9,代表兩個不同的版本,即1987年的版本和1989年的版本。

    JS讀取圖片真實格式

    當我們了解了前端二進制相關的知識后,就應該知道圖片文件也是能通過WebAPI對象,讀取到對應的數(shù)據(jù):

    const reader = new FileReader()reader.onload = () => {  const imgArrayBuffer = reader.result  const imgUint8Array = new Uint8Array(imgArrayBuffer)}reader.readAsArrayBuffer(file)

    以上代碼,就是通過 FileReader 對象讀取文件的數(shù)據(jù),這里是作為 ArrayBuffer 來讀取的,然后就可以轉(zhuǎn)換成類型數(shù)組進行處理了。

    讀取到圖片文件的 Uint8Array 類型數(shù)組數(shù)據(jù)后,根據(jù)上文表格中提到的格式字節(jié)數(shù)據(jù)標識,我們以jpg、bmp和webp為例:

    imgUint8Array[0] === 66 && imgUint8Array[1] === 77 // bmp 格式imgUint8Array[0] === 255 && imgUint8Array[1] === 216 && imgUint8Array[3] === 255 // jpg 格式imgUint8Array[8] === 87 && imgUint8Array[9] === 69 && imgUint8Array[10] === 66 && imgUint8Array[10] === 80 // webp 格式

    到此,就可以使用這種方式來讀取到圖片的真實格式,部分判斷代碼如下:

    // 各格式對應圖像數(shù)據(jù)的標識數(shù)值const IMAGEFORMATS = [  { ext: "png", data: [137, 80, 78, 71, 13, 10, 26, 10] },  { ext: "jpg", data: [255, 216, 255] },  { ext: "gif", data: [71, 73, 70] },  { ext: "ico", data: [0, 0, 1, 0] },  { ext: "bmp", data: [66, 77] },  { ext: "webp", data: [87, 69, 66, 80], offset: 8 }]// 循環(huán)判斷文件是否符合某個格式對應的標識數(shù)值for (let i = 0; i < IMAGEFORMATS.length; i++) {  const { data, offset, ext } = IMAGEFORMATS[i]  if (isEqualFormatPrefix(imgUint8Array, data, offset)) {    return ext  }}

    不過以上的方式主要是針對位圖,如果是svg的圖片,則會稍微復雜一些,需要另行處理。

    svg格式的判斷

    svg格式圖片是矢量圖,對應的數(shù)據(jù)一般使用 xml 標記語言進行描述,所以我們讀取到圖像數(shù)據(jù)后,需要對應的標識署名是 <svg,如果對應的圖像數(shù)據(jù)中擁有該標識,則大致可以判定為svg格式的圖片。

    <svg標識有4個符號和字母,對應的數(shù)值:60, 115, 118, 103,接下來我就需要判斷圖像文件是否有同樣的數(shù)據(jù)了。

    imgUint8Array[0] === 60 && imgUint8Array[1] === 115 && imgUint8Array[3] === 118 && imgUint8Array[3] === 103 // svg 格式

    以上代碼就是簡單的判斷svg格式了。

    但是,我們一般的svg圖片,圖像數(shù)據(jù)最開始是包含有xml標記語言的 <?xm 標簽,這個時候我們根據(jù)格式再判斷:

    if (isEqualFormatPrefix(fileUint8Array, [60, 63, 120, 109], offset)) { // 判斷是否以 <?xm 開頭  if (isHasSignCodes(fileUint8Array, [60, 115, 118, 103])) { // 判斷是否包含 <svg 標簽    return"svg"  }}

    注意:以上針對svg格式矢量圖的這種判斷方式,是以 xml 標記語言的標簽符號進行判斷的,只能處理通過更改后綴名的方式偽造的圖片文件。當我們偽造一個假的文件,包含有 <svg 標簽標識時,則可以逃避這種判斷。

    總結

    瀏覽器支持的圖片格式中,除了svg以外,其他幾種位圖格式,都可以較好的通過讀取圖像二進制數(shù)據(jù)的方式判斷出圖片文件的真實格式,能夠防止文件偽造繞開判斷,造成不必要的異常等問題。

    到此這篇關于JavaScript實現(xiàn)獲取圖片文件真實格式的示例代碼的文章就介紹到這了,更多相關JavaScript獲取圖片文件真實格式內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持!

    標簽: JavaScript
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    国产一区导航| 免费视频亚洲| 中文字幕一区二区av| 欧美特黄一级| 合欧美一区二区三区| 欧美天堂亚洲电影院在线观看| 99久精品视频在线观看视频| 国产精品精品| 91精品xxx在线观看| 久久婷婷激情| 在线精品小视频| 首页欧美精品中文字幕| 蜜臀av亚洲一区中文字幕| 亚洲三级网址| 日韩毛片一区| 国产午夜久久av| 麻豆国产精品777777在线| 国产成人精品一区二区三区视频 | 中文在线一区| 日韩专区欧美专区| 亚洲乱亚洲高清| 国产精品日本一区二区三区在线| 久久久91麻豆精品国产一区| 国产精品不卡| 婷婷综合社区| 亚洲欧洲免费| 麻豆中文一区二区| 久久中文视频| 少妇精品在线| 久久免费精品| 亚洲性图久久| 玖玖玖国产精品| 国产亚洲一卡2卡3卡4卡新区| 卡一卡二国产精品| 亚洲成人国产| 亚洲精品黄色| 国内揄拍国内精品久久| 亚洲午夜精品久久久久久app| 免费精品视频在线| 老司机免费视频一区二区三区| 日韩理论视频| 国产精品毛片在线| 国产精品久久久久久妇女| 精品国产第一福利网站| 欧美专区一区二区三区| 欧美黑人做爰爽爽爽| 亚洲免费福利| 亚洲在线成人| 国产极品久久久久久久久波多结野| 色婷婷精品视频| 日韩精品欧美大片| 日韩不卡免费高清视频| 日韩精品国产精品| 精品三级久久| 91亚洲无吗| 国产一区清纯| 牛牛精品成人免费视频| 亚洲深夜福利| 精品国产三区在线| 免费看日韩精品| 午夜av不卡| 亚洲精品欧美| 国产99久久| 国产乱人伦精品一区| 91精品国产乱码久久久久久久 | 亚洲黄色在线| 免费日韩成人| 国产亚洲综合精品| 成人国产精品一区二区免费麻豆| 久久国产99| 日韩黄色大片| 国产探花一区在线观看| 秋霞影院一区二区三区| 欧美日韩91| 国产精品日韩久久久| 四虎国产精品免费观看| 亚洲另类视频| 在线日韩欧美| 久久精品国产99国产精品| 亚洲一区二区三区中文字幕在线观看| 日韩影院二区| 国产日韩一区二区三免费高清| 夜夜嗨一区二区| 日韩一区自拍| 国产成人免费精品| 国产日韩中文在线中文字幕| 久久高清免费观看| 欧洲av一区二区| 国产精品超碰| 日本成人在线视频网站| 夜夜嗨一区二区| 91精品推荐| 国产日韩电影| 久久久久伊人| 国产精品白丝av嫩草影院| 日本在线观看不卡视频| 99香蕉国产精品偷在线观看 | 欧美高清一区| 日韩一区电影| 97精品国产福利一区二区三区| 欧美一区91| 亚洲欧美网站| 一本一道久久a久久精品蜜桃| 日本а中文在线天堂| 精品国产aⅴ| 国产精品大片| 欧美黑人巨大videos精品| 国产欧美日韩一区二区三区四区| 蜜桃久久精品一区二区| 日韩视频在线一区二区三区 | 91精品国产自产精品男人的天堂| 99香蕉国产精品偷在线观看 | 欧美一区=区| 欧美高清一区| 色婷婷狠狠五月综合天色拍| 国产 日韩 欧美 综合 一区| 久久av资源| 国产高清亚洲| 久久中文精品| 欧美成人一二区| 久久久久伊人| 国产一区二区三区久久| 精品久久久中文字幕| 美女视频网站久久| 久久精品资源| 国产一区二区三区黄网站| 麻豆国产精品777777在线| 久久精品系列| 日韩伦理福利| 久久久精品网| 欧美 日韩 国产一区二区在线视频 | 色8久久久久| 综合激情网站| 日本午夜精品一区二区三区电影 | 国产精品一区二区三区四区在线观看 | 亚洲福利一区| 狠狠干综合网| 国产一区导航| 蜜臀精品一区二区三区在线观看 | 精品国产成人| 午夜影院一区| 国产精品一线| 麻豆成人91精品二区三区| 福利一区二区三区视频在线观看| 波多野结衣久久精品| 99精品在线| 日韩精品免费一区二区三区| 日韩精品首页| 日韩中文字幕1| 日本精品另类| 麻豆成人91精品二区三区| 国产欧美日韩综合一区在线播放| 国产精品a久久久久| 伊人久久av| 欧美成人亚洲| 色综合视频一区二区三区日韩| 欧美国产视频| 欧美国产美女| 欧美福利在线| 亚洲精品字幕| 久久一区欧美| 国产精品av一区二区| 亚洲3区在线| 精品欧美视频| 亚洲性色视频| 日韩精品免费视频一区二区三区| 国产精品草草| 99精品网站| 日韩成人在线看| 福利片在线一区二区 | 久久一区二区三区喷水| 视频一区视频二区中文| 国产精品毛片aⅴ一区二区三区| 最近高清中文在线字幕在线观看1| 在线午夜精品| 国产精品久久国产愉拍| 亚洲精品.com| 亚洲精品影视| 日韩电影在线视频| 中文字幕免费精品| 国产精品香蕉| 91九色精品国产一区二区| 欧美日韩18| 国产高清久久| 国产免费av国片精品草莓男男| 日韩三区在线| 久久激五月天综合精品| 在线日韩欧美| 老鸭窝一区二区久久精品| 国产精品日本| 中文在线中文资源| 日本成人手机在线| 亚洲四虎影院| 国产欧美一区二区精品久久久| 香蕉人人精品| 国产三级精品三级在线观看国产| 婷婷丁香综合| 精品国产免费人成网站| 国产欧美高清| 亚洲精选久久|