لقد واجهت شرطًا: افترض أن هناك ملف صورة مع النوع الحقيقي من JPG ، وشخص كسول لنسخ JPG مباشرة وحفظه كملف PNG الذي يحمل نفس الاسم. وبهذه الطريقة ، لن تكون هناك مشاكل عند قراءة الملف AS3 ، لكن الهاتف المحمول C ++ يواجه مشاكل عند قراءة الملف - -!
تحتاج الآن إلى كتابة برنامج لاجتياز جميع الملفات في المجلدات والعثور على الملفات بتنسيق ملف "غير عادي". مواردنا هي أساسا GIF و PNG و JPG. في البداية ، وجدت مقالة عبر الإنترنت: الحصول على نوع الملف من نوع MIME استنادًا إلى الدفق الثنائي ورأس الملف ، ثم اقرأ معلومات الرأس الخاصة بالملف الثنائي ، والحصول على نوع الملف الحقيقي ، وقارنه بنوع الملف الذي تم الحصول عليه من خلال اسم لاحقة.
نسخة الكود كما يلي:
var fd = fs.opensync (new_file_path ، 'r') ؛
var buffer = new Buffer (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) ؛
يكمل؛
}
}
if (tempfileType! = fileType) {
var msg = "error fileType" + new_file_path + '-' + fileType + '|' + tempfiletype + '-تنسيق ملف الصورة المصححة' ؛
Showlog (MSG) ؛
g_errorfiletyparr.push (msg) ؛
}
في وقت لاحق ، عند البحث عن معلومات تتعلق بصورة العقدة ، وجدت هذه المقالة: Node.js Module Renking >> (صور)
ثم قم بتصفية وحدة "Node-ImageInfo" وكتب مثالًا للاختبار (تعديل اسم لاحقة ملف JPG مباشرة إلى PNG):
رمز المصدر الخاص به ، إذا كنت مهتمًا ، يمكنك دراسته:
نسخة الكود كما يلي:
وظيفة readuint32 (العازلة ، الإزاحة ، Bigendian) {
if (buffer.readuint32) {
إرجاع Buffer.Readuint32 (الإزاحة ، Bigendian) ؛
}
var قيمة
إذا (Bigendian) {
if (buffer.readuint32be) {
إرجاع buffer.Readuint32be (إزاحة) ؛
}
value = (Buffer [Offset] << 24) + (Buffer [Offset + 1] << 16) + (Buffer [Offset + 2] << 8) + Buffer [Offset + 3] ؛
}
آخر {
if (buffer.readuint32le) {
إرجاع buffer.readuint32le (الإزاحة) ؛
}
value = buffer [Offset] + (Buffer [Offset + 1] << 8) + (Buffet [Offset + 2] << 16) + (Buffer [Offset + 3] << 24) ؛
}
قيمة الإرجاع
}
وظيفة readuint16 (العازلة ، الإزاحة ، Bigendian) {
if (buffer.readuint16) {
Return Buffer.Readuint16 (إزاحة ، Bigendian) ؛
}
var قيمة
إذا (Bigendian) {
if (buffer.readuint16be) {
إرجاع buffer.Readuint16be (إزاحة) ؛
}
value = (Buffer [Offset] << 8) + Buffer [Offset + 1] ؛
}
آخر {
if (buffer.readuint16le) {
إرجاع buffer.Readuint16le (إزاحة) ؛
}
value = Buffer [Offset] + (Buffet [Offset + 1] << 8) ؛
}
قيمة الإرجاع
}
وظيفة readbit (المخزن المؤقت ، الإزاحة ، bitoffset) {
if (bitoffset> 7) {
الإزاحة += Math.floor (bitoffset / 8) ؛
bitoffset = bitoffset ٪ 8 ؛
}
var b = buffer [offset] ؛
if (bitoffset <7) {
B >>> = (7 - Bitoffset) ؛
}
var val = b & 0x01 ؛
إرجاع فال
}
قراءات الوظيفة (المخزن المؤقت ، الإزاحة ، bitoffset ، bitlen ، توقيع) {
var val = 0 ؛
var neg = false ؛
إذا (توقيع) {
if (readbit (المخزن المؤقت ، الإزاحة ، bitoffset)> 0) {
neg = صحيح ؛
}
Bitlen-- ؛
Bitoffset ++ ؛
}
var bytes = [] ؛
لـ (var i = 0 ؛ i <bitlen ؛ i ++) {
var b = readbit (المخزن المؤقت ، الإزاحة ، bitoffset + i) ؛
if (i> 0 && (bitlen - i) ٪ 8 == 0) {
bytes.push (val) ؛
فال = 0 ؛
}
val << = 1 ؛
فال | = ب ؛
}
bytes.push (val) ؛
val = عازلة جديدة (بايت) ؛
Val.Negative = neg؟ صحيح: خطأ ؛
إرجاع فال
}
وظيفة ImageInfopng (العازلة) {
var imageHeader = [0x49 ، 0x48 ، 0x44 ، 0x52] ،
POS = 12 ؛
if (! checksig (buffer ، pos ، imageheader)) {
العودة كاذبة
}
POS += 4 ؛
يعود {
اكتب: "الصورة" ،
التنسيق: 'png' ،
Mimetype: 'Image/PNG' ،
العرض: readuint32 (عازلة ، نقاط البيع ، صواب) ،
الارتفاع: readuint32 (Buffer ، pos+4 ، true) ،
} ؛
}
وظيفة ImageInfojpg (Buffer) {
var pos = 2 ،
len = buffer.length ،
SiSeSig = [0xff ، [0xc0 ، 0xc2]] ؛
بينما (pos <len) {
if (checksig (buffer ، pos ، sisterig)) {
POS += 5 ؛
يعود {
اكتب: "الصورة" ،
التنسيق: 'JPG' ،
Mimetype: "Image/JPEG" ،
العرض: readuint16 (العازلة ، POS+2 ، صواب) ،
الارتفاع: readuint16 (عازلة ، نقاط البيع ، صواب) ،
} ؛
}
POS += 2 ؛
var size = readUint16 (buffer ، pos ، true) ؛
POS += الحجم ؛
}
}
وظيفة ImageInFogif (Buffer) {
var pos = 6 ؛
يعود {
اكتب: "الصورة" ،
التنسيق: 'GIF' ،
Mimetype: "الصورة/gif" ،
العرض: readuint16 (عازلة ، نقاط البيع ، خطأ) ،
الارتفاع: readuint16 (المخزن المؤقت ، pos+2 ، خطأ) ،
} ؛
}
وظيفة ImageInfoswf (Buffer) {
var pos = 8 ،
bitpos = 0 ،
فال
if (buffer [0] === 0x43) {
يحاول {
// إذا كان لديك ZLIB متاح (NPM تثبيت ZLIB) ، فيمكننا قراءة ملفات الفلاش المضغوطة
Buffer = require ('zlib'). تضخيم (buffer.slice (8 ، 100)) ؛
POS = 0 ؛
}
catch (ex) {
// لا يمكن الحصول على عرض/ارتفاع ملفات الفلاش المضغوطة ... حتى الآن (بحاجة إلى Zlib)
يعود {
اكتب: "فلاش" ،
التنسيق: 'SWF' ،
Mimetype: 'Application/x-shockwave-flash' ،
العرض: فارغ ،
الارتفاع: لاغ ،
}
}
}
var numbits = readbits (buffer ، pos ، bitpos ، 5) [0] ؛
Bitpos += 5 ؛
val = readbits (Buffer ، POS ، bitpos ، numbits ، true) ؛
var xmin = (Numbits> 9؟ readuint16 (val ، 0 ، true): val [0]) * (val.negative؟ -1: 1) ؛
Bitpos += Numbits ؛
val = readbits (Buffer ، POS ، bitpos ، numbits ، true) ؛
var xmax = (Numbits> 9؟ readuint16 (val ، 0 ، true): val [0]) * (val.negative؟ -1: 1) ؛
Bitpos += Numbits ؛
val = readbits (Buffer ، POS ، bitpos ، numbits ، true) ؛
var ymin = (Numbits> 9؟ readuint16 (val ، 0 ، true): val [0]) * (val.negative؟ -1: 1) ؛
Bitpos += Numbits ؛
val = readbits (Buffer ، POS ، bitpos ، numbits ، true) ؛
var ymax = (Numbits> 9؟ readuint16 (val ، 0 ، true): val [0]) * (val.negative؟ -1: 1) ؛
يعود {
اكتب: "فلاش" ،
التنسيق: 'SWF' ،
Mimetype: 'Application/x-shockwave-flash' ،
العرض: Math.ceil ((Xmax - Xmin) / 20) ،
الارتفاع: Math.ceil ((Ymax - Ymin) / 20) ،
} ؛
}
ChecksIg للوظيفة (المخزن المؤقت ، الإزاحة ، sig) {
var len = sig.length ؛
لـ (var i = 0 ؛ i <len ؛ i ++) {
var b = buffer [i+offset] ،
s = sig [i] ،
م = خطأ ؛
if ('number' == typeof s) {
m = s === b ؛
}
آخر {
لـ (var k in s) {
var o = s [k] ؛
if (o === b) {
M = صحيح ؛
}
}
}
إذا (! م) {
العودة كاذبة
}
}
العودة صحيح.
}
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)) إرجاع ImageInfopng (المخزن المؤقت) ؛
if (checksig (buffer ، 0 ، jpgsig)) return ImageInfojpg (buffer) ؛
إذا (checksig (Buffer ، 0 ، gifsig)) إرجاع ImageInFogif (المخزن المؤقت) ؛
if (checksig (Buffer ، 0 ، SWFSIG)) إرجاع ImageInfoswf (المخزن المؤقت) ؛
العودة كاذبة
} ؛