Я столкнулся с требованием: предположим, что есть файл изображения с реальным типом JPG, и кто -то ленится напрямую копировать JPG и сохранить его в виде файла PNG с тем же именем. Таким образом, при чтении файла AS3 не будет проблем, но мобильный телефон C ++ сталкивается с проблемами при чтении файла - -!
Теперь вам нужно написать программу, чтобы пройти все файлы в папках и найти файлы с «необычным» форматом файлов. Наши ресурсы в основном GIF, PNG и JPG. Вначале я нашел статью в Интернете: Получите тип файла тип MIME на основе двоичного потока и заголовка файла, а затем прочитайте информацию о заголовке двоичного файла, получите его реальный тип файла и сравните ее с типом файла, полученным с помощью имени суффикса.
Кода -копия выглядит следующим образом:
var fd = fs.opensync (new_file_path, 'r');
VAR Buffer = новый буфер (8);
var minetype = mime.lookup (new_file_path);
var filetype = mime.extension (minetype);
fs.readsync (fd, буфер, 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);
продолжать;
}
}
if (tempfileType! = fileType) {
var msg = "ошибка filetype" + new_file_path + '-' + filetype + '|' + tempfileType + '-корректный формат файла изображения';
ShowLog (MSG);
g_errorfiletyparr.push (msg);
}
Позже, при поиске информации, связанной с изображением узла, я нашел эту статью: Ranking node.js модуль >> (Images)
Затем отфильтруйте модуль «Node-ImageInfo» и написал пример для тестирования (намеренно изменить имя суффикса файла JPG непосредственно на PNG):
Его исходный код, если вы заинтересованы, вы можете изучить его:
Кода -копия выглядит следующим образом:
Функция readuint32 (буфер, смещение, bigendian) {
if (buffer.readuint32) {
return Buffer.readuint32 (Offset, Bigendian);
}
var value;
if (bigendian) {
if (buffer.readuint32be) {
return Buffer.readuint32be (Offset);
}
value = (Buffer [Offset] << 24) + (Buffer [Offset + 1] << 16) + (Buffer [Offset + 2] << 8) + Buffer [Offset + 3];
}
еще {
if (buffer.readuint32le) {
return Buffer.readuint32le (Offset);
}
value = buffer [offset] + (buffer [offset + 1] << 8) + (Buffer [Offset + 2] << 16) + (Buffer [Offset + 3] << 24);
}
возвращаемое значение;
}
Функция readuint16 (буфер, смещение, bigendian) {
if (buffer.readuint16) {
return Buffer.readuint16 (Offset, Bigendian);
}
var value;
if (bigendian) {
if (buffer.readuint16be) {
return Buffer.readuint16be (Offset);
}
value = (Buffer [Offset] << 8) + буфер [Offset + 1];
}
еще {
if (buffer.readuint16le) {
return buffer.readuint16le (смещение);
}
value = buffer [Offset] + (Buffer [Offset + 1] << 8);
}
возвращаемое значение;
}
Функция readbit (буфер, смещение, 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;
вернуть Вэл;
}
Функция readbits (буфер, смещение, битфсет, bitlen, подписано) {
var val = 0;
var neg = false;
if (подписано) {
if (readbit (buffer, offset, bitoffset)> 0) {
neg = true;
}
Битлен-;
bitoffset ++;
}
var bytes = [];
for (var i = 0; i <bitlen; i ++) {
var b = readbit (буфер, смещение, биофсет + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
Bytes.push (val);
val = 0;
}
val << = 1;
val | = b;
}
Bytes.push (val);
val = новый буфер (байты);
val.negative = neg? True: false;
вернуть Вэл;
}
Функция ImageInfopng (Buffer) {
var ImageHeader = [0x49, 0x48, 0x44, 0x52],
POS = 12;
if (! Checksig (Buffer, POS, ImageHeader)) {
вернуть ложь;
}
pos += 4;
возвращаться {
Тип: 'Image',
формат: 'png',
MimeType: 'Image/png',
Ширина: readuint32 (буфер, POS, True),
Высота: Readuint32 (буфер, POS+4, True),
};
}
Функция ImageInfojpg (Buffer) {
var pos = 2,
len = buffer.length,
sizesig = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (checksig (buffer, pos, sizesig)) {
pos += 5;
возвращаться {
Тип: 'Image',
Формат: 'jpg',
MimeType: 'Image/jpeg',
Ширина: readuint16 (буфер, pos+2, true),
высота: readuint16 (буфер, POS, True),
};
}
pos += 2;
var size = readuint16 (buffer, pos, true);
pos += size;
}
}
Функция ImageInfogif (buffer) {
var pos = 6;
возвращаться {
Тип: 'Image',
формат: 'GIF',
MimeType: 'Image/Gif',
ширина: readuint16 (буфер, pos, false),
высота: readuint16 (буфер, POS+2, false),
};
}
Функция ImageInfoswf (Buffer) {
var pos = 8,
bitpos = 0,
Вэл;
if (buffer [0] === 0x43) {
пытаться {
// Если у вас есть ZLIB (NPM Install Zlib), мы можем прочитать сжатые флэш -файлы
buffer = require ('zlib'). надувать (buffer.slice (8, 100));
pos = 0;
}
поймать (ex) {
// не может получить ширину/высоту сжатых флэш -файлов ... пока (нужен Zlib)
возвращаться {
Тип: 'Flash',
Формат: 'SWF',
MimeType: 'Application/X-Shockwave-Flash',
Ширина: NULL,
Высота: NULL,
}
}
}
var numbits = readbits (buffer, pos, bitpos, 5) [0];
bitpos += 5;
val = readbits (буфер, pos, bitpos, numbits, true);
var xmin = (numbits> 9? Readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (буфер, pos, bitpos, numbits, true);
var xmax = (numbits> 9? Readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (буфер, pos, bitpos, numbits, true);
var ymin = (numbits> 9? Readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (буфер, pos, bitpos, numbits, true);
var ymax = (numbits> 9? Readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
возвращаться {
Тип: 'Flash',
Формат: 'SWF',
MimeType: 'Application/X-Shockwave-Flash',
Ширина: math.ceil ((xmax - xmin) / 20),
Высота: math.ceil ((ymax - ymin) / 20),
};
}
Function Checksig (буфер, смещение, sig) {
var len = sig.length;
для (var i = 0; i <len; i ++) {
var b = buffer [i+смещение],
s = sig [i],
m = false;
if ('number' == typeof s) {
m = s === B;
}
еще {
для (var k in s) {
var o = s [k];
if (o === b) {
m = true;
}
}
}
if (! m) {
вернуть ложь;
}
}
вернуть истину;
}
module.exports = function imageInfo (буфер, 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)) return imageinfopng (buffer);
if (checksig (buffer, 0, jpgsig)) return imageinfojpg (buffer);
if (checksig (buffer, 0, gifsig)) return imageinfogif (buffer);
if (checksig (buffer, 0, swfsig)) return imageinfoswf (buffer);
вернуть ложь;
};