ノード.JS識別画像タイプ


Nodejs識別画像タイプ
ファイル名の拡張子を切断して画像フォーマットを取得する方法は正確ではないです.ファイルの拡張子は強制的に変更されます.このようにしてgif画像も保存されます.jpg、
Nodeではファイルタイプのチェックはどうしますか?
ファイルヘッダの識別により画像フォーマットを判断する.
実はとても簡単です.各画像ファイルにはファイルヘッダの表示があります.各フォーマットの画像のファイルヘッダの表示は全部違っていますので、ファイルヘッダの識別を判断することによって画像フォーマットを識別することができます.
インターネットで資料を探すことによって、下記の画像ファイルのヘッダの表示をまとめました.
1.JPEG/JPG-ファイルヘッダ識別(2 bytes):ff,d 8ファイル終了識別(2 bytes):ff,d 9
2.TGA-非圧縮の前5バイト00-02 00-RLE圧縮の前5バイト00-10 00
3.PNG-ファイルヘッダ識別(8 bytes)89 50 E 47 0 D 0 A 1 A 0 A
4.GIF-ファイルヘッダ識別(6 bytes)47 49 46 38(37)61
5.BMP-ファイルヘッダ識別(2 bytes)42 4 D B M
6.PCX-ファイルヘッダ識別(1 bytes)0 A
7.TIFF-ファイルヘッダ識別(2 bytes)4 D 4 Dまたは49
8.ICO-ファイルヘッダ識別(8 bytes)00 00 01 00 01 00 20
9.CUR-ファイルヘッダID(8 bytes)00 02 00 01 00 20
10.IF-ファイルヘッダ識別(4 bytes)46 4 F 52 4 D
11.ANI-ファイルヘッダ識別(4 bytes)52 49 46 : 1バイト(bytes)=8 bitts、上の数字は全部16進数で4 bittsの空間を占め、2つの16進数で1バイトを占めます.
どう判断しますか
画像リソースのバイナリストリームをこの識別子と照合することにより、ピクチャフォーマットを判断することができる.
実現ロジックはとても簡単なので、具体的な実現ロジックはコードとコメントを見ればいいです.ここで参考にして、みんなの開発に便利です.
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で画像フォーマットを正確に識別することができる.
文章が短いので、あなたの役に立ちたいです.