Saya menemukan persyaratan: Misalkan ada file gambar dengan jenis JPG yang sebenarnya, dan seseorang malas untuk menyalin JPG secara langsung dan menyimpannya sebagai file PNG dengan nama yang sama. Dengan cara ini, tidak akan ada masalah saat membaca file AS3, tetapi ponsel C ++ mengalami masalah saat membaca file - -!
Sekarang Anda perlu menulis program untuk melintasi semua file di folder dan menemukan file dengan format file "tidak biasa". Sumber daya kami terutama GIF, PNG, dan JPG. Pada awalnya, saya menemukan artikel online: Dapatkan jenis file tipe mime berdasarkan aliran biner dan header file, dan kemudian membaca informasi header dari file biner, dapatkan jenis file yang sebenarnya, dan bandingkan dengan jenis file yang diperoleh melalui nama akhiran.
Salinan kode adalah sebagai berikut:
var fd = fs.opensync (new_file_path, 'r');
var buffer = buffer baru (8);
var minetype = mime.lookup (new_file_path);
var filetype = mime.extension (minetype);
fs.readsync (fd, buffer, 0, 8, 0);
var newbuf = buffer.slice (0, 4);
var head_1 = newbuf [0] .toString (16);
var head_2 = newbuf [1] .toString (16);
var head_3 = newbuf [2] .toString (16);
var head_4 = newbuf [3] .toString (16);
var head_iden = head_1 + head_2;
var tempfileType = file_type_config [head_iden];
if (! TempFileType) {
head_iden += head_3;
tempfileType = file_type_config [head_iden];
if (! TempFileType) {
var msg = "unknow filetype" + new_file_path + '-' + filetype;
showlog (msg);
melanjutkan;
}
}
if (tempfileType! = filetype) {
var msg = "kesalahan filetype" + new_file_path + '-' + filetype + '|' + tempfileType + '-format file gambar correct';
showlog (msg);
g_errorfiletyparr.push (msg);
}
Kemudian, saat mencari informasi yang terkait dengan gambar node, saya menemukan artikel ini: peringkat modul node.js >> (gambar)
Kemudian filter modul "node-imageInfo" dan menulis contoh untuk pengujian (sengaja memodifikasi nama akhiran file jpg langsung ke png):
Kode sumbernya, jika Anda tertarik, Anda dapat mempelajarinya:
Salinan kode adalah sebagai berikut:
Fungsi readuint32 (buffer, offset, bigendian) {
if (buffer.readuint32) {
return buffer.readuint32 (Offset, Bigendian);
}
nilai var;
if (bigendian) {
if (buffer.readuint32be) {
return buffer.readuint32be (offset);
}
value = (buffer [offset] << 24) + (buffer [offset + 1] << 16) + (buffer [offset + 2] << 8) + buffer [offset + 3];
}
kalau tidak {
if (buffer.readuint32le) {
return buffer.readuint32le (offset);
}
value = buffer [offset] + (buffer [offset + 1] << 8) + (buffer [offset + 2] << 16) + (buffer [offset + 3] << 24);
}
nilai pengembalian;
}
Fungsi Readuint16 (Buffer, Offset, Bigendian) {
if (buffer.readuint16) {
return buffer.readuint16 (Offset, Bigendian);
}
nilai var;
if (bigendian) {
if (buffer.readuint16be) {
return buffer.readuint16be (offset);
}
value = (buffer [offset] << 8) + buffer [offset + 1];
}
kalau tidak {
if (buffer.readuint16le) {
return buffer.readuint16le (offset);
}
nilai = buffer [offset] + (buffer [offset + 1] << 8);
}
nilai pengembalian;
}
fungsi readbit (buffer, offset, bitoffset) {
if (bitoffset> 7) {
Offset += Math.floor (BitOffset / 8);
BitOffset = BitOffset % 8;
}
var b = buffer [offset];
if (bitoffset <7) {
B >>> = (7 - Bitoffset);
}
var val = b & 0x01;
return val;
}
fungsi readbits (buffer, offset, bitoffset, bitlen, ditandatangani) {
var val = 0;
var neg = false;
if (ditandatangani) {
if (readbit (buffer, offset, bitoffset)> 0) {
neg = true;
}
Bitlen--;
Bitoffset ++;
}
var bytes = [];
untuk (var i = 0; i <bitlen; i ++) {
var b = readbit (buffer, offset, bitoffset + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
bytes.push (val);
val = 0;
}
val << = 1;
val | = b;
}
bytes.push (val);
val = buffer baru (bytes);
val.negative = neg? True: false;
return val;
}
function imageInfopng (buffer) {
var ImageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! checksig (buffer, pos, imageHeader)) {
mengembalikan false;
}
pos += 4;
kembali {
Ketik: 'Gambar',
Format: 'png',
Mimetype: 'Image/Png',
Lebar: readuint32 (buffer, pos, true),
Tinggi: readuint32 (buffer, pos+4, true),
};
}
function imageInfojpg (buffer) {
var pos = 2,
len = buffer.length,
sizeig = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (checksig (buffer, pos, sizeig)) {
pos += 5;
kembali {
Ketik: 'Gambar',
Format: 'jpg',
Mimetype: 'Image/JPEG',
Lebar: readuint16 (buffer, pos+2, true),
Tinggi: readuint16 (buffer, pos, true),
};
}
pos += 2;
var size = readuint16 (buffer, pos, true);
pos += ukuran;
}
}
function imageInfogif (buffer) {
var pos = 6;
kembali {
Ketik: 'Gambar',
Format: 'gif',
Mimetype: 'Image/GIF',
Lebar: readuint16 (buffer, pos, false),
Tinggi: readuint16 (buffer, pos+2, false),
};
}
function imageInfoswf (buffer) {
var pos = 8,
bitpos = 0,
val;
if (buffer [0] === 0x43) {
mencoba {
// Jika Anda memiliki zlib tersedia (instal npm zlib) maka kami dapat membaca file flash terkompresi
buffer = membutuhkan ('zlib'). mengembang (buffer.slice (8, 100));
pos = 0;
}
Catch (ex) {
// Tidak bisa mendapatkan lebar/tinggi file flash terkompresi ... belum (butuh zlib)
kembali {
Ketik: 'Flash',
Format: 'swf',
Mimetype: 'Aplikasi/X-Shockwave-Flash',
Lebar: NULL,
Tinggi: NULL,
}
}
}
var numbits = readbits (buffer, pos, bitpos, 5) [0];
Bitpos += 5;
val = readbits (buffer, pos, bitpos, mati rasa, true);
var xmin = (MuMBITS> 9? REEDUInt16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += mati rasa;
val = readbits (buffer, pos, bitpos, mati rasa, true);
var xmax = (MuMBITS> 9? REEDUInt16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += mati rasa;
val = readbits (buffer, pos, bitpos, mati rasa, true);
var ymin = (MuMBITS> 9? REEDUInt16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += mati rasa;
val = readbits (buffer, pos, bitpos, mati rasa, true);
var ymax = (MuMBITS> 9? Readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
kembali {
Ketik: 'Flash',
Format: 'swf',
Mimetype: 'Aplikasi/X-Shockwave-Flash',
Lebar: Math.ceil ((xmax - xmin) / 20),
Tinggi: Math.Ceil ((YMAX - YMIN) / 20),
};
}
function checkSig (buffer, offset, sig) {
var len = sig.length;
untuk (var i = 0; i <len; i ++) {
var b = buffer [i+offset],
s = sig [i],
m = false;
if ('number' == typeOf s) {
m = s === b;
}
kalau tidak {
untuk (var k in s) {
var o = s [k];
if (o === b) {
m = true;
}
}
}
if (! m) {
mengembalikan false;
}
}
Kembali Benar;
}
module.exports = function imageInfo (buffer, path) {
var pngsig = [0x89, 0x50, 0x4e, 0x47, 0x0D, 0x0a, 0x1a, 0x0a];
var jpgsig = [0xff, 0xd8, 0xff];
var gifsig = [0x47, 0x49, 0x46, 0x38, [0x37, 0x39], 0x61];
var swfsig = [[0x46, 0x43], 0x57, 0x53];
if (checksig (buffer, 0, pngsig)) mengembalikan imageInfopng (buffer);
if (checksig (buffer, 0, jpgsig)) mengembalikan imageInfojpg (buffer);
if (checksig (buffer, 0, gifsig)) return imageInfogif (buffer);
if (checksig (buffer, 0, swfsig)) return imageInfoswf (buffer);
mengembalikan false;
};