Node.JS 識別圖片類型

Nodejs 識別圖片類型

經過切文件名稱後綴來得到圖片格式的方式是不許確的,由於文件後綴是能夠被強行更改的,這樣一個.gif 圖片也能夠被保存成.jpg,數組

那麼在 Node 上咱們如何作文件類型的校驗呢code

經過文件頭標識判斷圖片格式

其實很簡單,每一個圖片文件都有文件頭標識,各類格式的圖片的文件頭標識都是不同,因此能夠經過判斷文件頭的標識來識別圖片格式。圖片

經過在網上找資料,彙總了以下的 圖片文件頭標識:資源

1.JPEG/JPG - 文件頭標識 (2 bytes): ff, d8 文件結束標識 (2 bytes): ff, d9
2.TGA - 未壓縮的前 5 字節 00 00 02 00 00 - RLE 壓縮的前 5 字節 00 00 10 00 00
3.PNG - 文件頭標識 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
4.GIF - 文件頭標識 (6 bytes) 47 49 46 38 39(37) 61
5.BMP - 文件頭標識 (2 bytes) 42 4D B M
6.PCX - 文件頭標識 (1 bytes) 0A
7.TIFF - 文件頭標識 (2 bytes) 4D 4D 或 49 49
8.ICO - 文件頭標識 (8 bytes) 00 00 01 00 01 00 20 20
9.CUR - 文件頭標識 (8 bytes) 00 00 02 00 01 00 20 20
10.IFF - 文件頭標識 (4 bytes) 46 4F 52 4D
11.ANI - 文件頭標識 (4 bytes) 52 49 46 46

知識點: 1 字節(bytes) = 8 bits,上面的數字均爲 16 進制也就佔 4bits 空間,每兩個 16 進制數字佔一字節開發

如何判斷

經過將圖片資源的二進制流與該標識作比對,便可判斷圖片格式。get

由於實現邏輯很是簡單,具體的實現邏輯看代碼和註釋就就好,在這裏貢獻出來給你們參考,方便你們開發使用。it

function getImageSuffix(fileBuffer) {
  // 將上文提到的 文件標識頭 按 字節 整理到數組中
  const imageBufferHeaders = [
    { bufBegin: [0xff, 0xd8], bufEnd: [0xff, 0xd9], suffix: '.jpg' },
    { bufBegin: [0x00, 0x00, 0x02, 0x00, 0x00], suffix: '.tga' },
    { bufBegin: [0x00, 0x00, 0x10, 0x00, 0x00], suffix: '.rle' },
    {
      bufBegin: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],
      suffix: '.png'
    },
    { bufBegin: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], suffix: '.gif' },
    { bufBegin: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], suffix: '.gif' },
    { bufBegin: [0x42, 0x4d], suffix: '.bmp' },
    { bufBegin: [0x0a], suffix: '.pcx' },
    { bufBegin: [0x49, 0x49], suffix: '.tif' },
    { bufBegin: [0x4d, 0x4d], suffix: '.tif' },
    {
      bufBegin: [0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20],
      suffix: '.ico'
    },
    {
      bufBegin: [0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x20, 0x20],
      suffix: '.cur'
    },
    { bufBegin: [0x46, 0x4f, 0x52, 0x4d], suffix: '.iff' },
    { bufBegin: [0x52, 0x49, 0x46, 0x46], suffix: '.ani' }
  ]
  for (const imageBufferHeader of imageBufferHeaders) {
    let isEqual
    // 判斷標識頭前綴
    if (imageBufferHeader.bufBegin) {
      const buf = Buffer.from(imageBufferHeader.bufBegin)
      isEqual = buf.equals(
        //使用 buffer.slice 方法 對 buffer 以字節爲單位切割
        fileBuffer.slice(0, imageBufferHeader.bufBegin.length)
      )
    }
    // 判斷標識頭後綴
    if (isEqual && imageBufferHeader.bufEnd) {
      const buf = Buffer.from(imageBufferHeader.bufEnd)
      isEqual = buf.equals(fileBuffer.slice(-imageBufferHeader.bufEnd.length))
    }
    if (isEqual) {
      return imageBufferHeader.suffix
    }
  }
  // 未能識別到該文件類型
  return ''
}

經過這種方式咱們就能在Node中準確地識別圖片格式。io

文章很短,但願能幫到你~function

相關文章
相關標籤/搜索