亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

node.js解決獲取圖片真實文件類型的問題

2019-11-20 13:39:17
字體:
來源:轉載
供稿:網友

遇到一個需求:假定有一個圖片文件,真實的類型為jpg,而有人偷懶把jpg直接復制一張,存為同名的png文件,這樣在as3讀取文件時不會遇到問題,但手機c++在讀取文件時卻遇到問題了 - -!

現在就需要寫一個程序,遍歷所有文件夾下的文件,查找文件格式“不正常”的文件。我們的資源主要是gif、png、jpg,最開始,我到網上找到一篇文章:根據二進制流及文件頭獲取文件類型mime-type,然后讀取文件二進制的頭信息,獲取其真實的文件類型,對與通過后綴名獲得的文件類型進行比較。

復制代碼 代碼如下:

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);
        continue;
    }
}

if (tempFileType != fileType) {
    var msg = "Error fileType" + new_file_path + '-' + fileType + '|' + tempFileType + '--正確的圖像文件格式';
    showLog(msg);

    g_errorFileTypArr.push(msg);
}

后來搜索node image相關的信息時,找到這篇文章:node.js module ranking>> (images)

然后篩選到一個模塊“node-imageinfo”,寫了一個例子進行測試(故意把jpg文件直接修改后綴名為png):

它的源碼,有興趣可以研究一下:


復制代碼 代碼如下:

function readUInt32(buffer, offset, 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];
    }
    else {
        if (buffer.readUInt32LE) {
            return buffer.readUInt32LE(offset);
        }
        value = buffer[offset] + (buffer[offset+1] << 8) + (buffer[offset+2] << 16) + (buffer[offset+3] << 24);
    }
    return value;
}

function readUInt16(buffer, offset, bigEndian) {
    if (buffer.readUInt16) {
        return buffer.readUInt16(offset, bigEndian);
    }

    var value;
    if (bigEndian) {
        if (buffer.readUInt16BE) {
            return buffer.readUInt16BE(offset);
        }
        value = (buffer[offset] << 8) + buffer[offset+1];
    }
    else {
        if (buffer.readUInt16LE) {
            return buffer.readUInt16LE(offset);
        }
        value = buffer[offset] + (buffer[offset+1] << 8);
    }
    return value;
}

function 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;
}

function readBits(buffer, offset, bitOffset, bitLen, signed) {
    var val = 0;
   
    var neg = false;
    if (signed) {
        if (readBit(buffer, offset, bitOffset) > 0) {
            neg = true;
        }
        bitLen--;
        bitOffset++;
    }

    var bytes = [];
    for (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 = new Buffer(bytes);
    val.negative = neg?true:false;
    return val;
}

function imageInfoPng(buffer) {
    var imageHeader = [0x49, 0x48, 0x44, 0x52],
        pos = 12;

    if (!checkSig(buffer, pos, imageHeader)) {
        return false;
    }

    pos += 4;
    return {
        type: 'image',
        format: 'PNG',
        mimeType: 'image/png',
        width: readUInt32(buffer, pos, true),
        height: readUInt32(buffer, pos+4, true),
    };
}

function imageInfoJpg(buffer) {
    var pos = 2,
        len = buffer.length,
        sizeSig = [0xff, [0xc0, 0xc2]];

    while (pos < len) {
        if (checkSig(buffer, pos, sizeSig)) {
            pos += 5;
            return {
                type: 'image',
                format: 'JPG',
                mimeType: 'image/jpeg',
                width: readUInt16(buffer, pos+2, true),
                height: readUInt16(buffer, pos, true),
            };
        }

        pos += 2;
        var size = readUInt16(buffer, pos, true);
        pos += size;
    }
}

function imageInfoGif(buffer) {
    var pos = 6;

    return {
        type: 'image',
        format: 'GIF',
        mimeType: 'image/gif',
        width: readUInt16(buffer, pos, false),
        height: readUInt16(buffer, pos+2, false),
    };
}

function imageInfoSwf(buffer) {
    var pos = 8,
        bitPos = 0,
        val;

    if (buffer[0] === 0x43) {
        try {
            // If you have zlib available ( npm install zlib ) then we can read compressed flash files
            buffer = require('zlib').inflate(buffer.slice(8, 100));
            pos = 0;
        }
        catch (ex) {
            // Can't get width/height of compressed flash files... yet (need zlib)
            return {
                type: 'flash',
                format: 'SWF',
                mimeType: 'application/x-shockwave-flash',
                width: null,
                height: null,
            }
        }
    }

    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);

    return {
        type: 'flash',
        format: 'SWF',
        mimeType: 'application/x-shockwave-flash',
        width: Math.ceil((xMax - xMin) / 20),
        height: Math.ceil((yMax - yMin) / 20),
    };
}

function checkSig(buffer, offset, sig) {
    var len = sig.length;
    for (var i = 0; i < len; i++) {
        var b = buffer[i+offset],
            s = sig[i],
            m = false;

        if ('number' == typeof s) {
            m = s === b;
        }
        else {
            for (var k in s) {
                var o = s[k];
                if (o === b) {
                    m = true;
                }
            }
        }

        if (!m) {
            return false;
        }
    }

    return true;
}

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)) 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);

    return false;
};

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线亚洲午夜片av大片| 蜜臀久久99精品久久久久久宅男| 最近中文字幕2019免费| 国产69久久精品成人看| 欧美黄网免费在线观看| 久久久久久久久久婷婷| 91久久久亚洲精品| 亚洲美女性生活视频| 国产91精品久久久久久| 91免费在线视频网站| 激情久久av一区av二区av三区| 欧美电影在线免费观看网站| 成人久久一区二区三区| 欧美亚州一区二区三区| 国语自产精品视频在线看抢先版图片| 亚洲欧洲在线免费| 精品久久久在线观看| 青青a在线精品免费观看| 最近2019免费中文字幕视频三| 51精品国产黑色丝袜高跟鞋| 亚洲精品小视频在线观看| 中文字幕av一区二区三区谷原希美| 欧美夫妻性生活视频| 国产成人精品一区二区| 日韩高清电影免费观看完整版| 九九久久久久99精品| 欧美性猛交xxxx富婆弯腰| 久久精品亚洲94久久精品| 欧美在线视频网站| 成人性生交大片免费观看嘿嘿视频| 亚洲jizzjizz日本少妇| 国产91精品久久久久久久| 亚洲第一色在线| 国产亚洲精品久久久久久牛牛| 国内精品美女av在线播放| 性欧美长视频免费观看不卡| 性色av一区二区三区红粉影视| 日韩国产在线看| 国产日产欧美a一级在线| 欧美中文字幕精品| 亚洲三级黄色在线观看| 久久国产精品久久久| 亚洲精品福利免费在线观看| 欧美中文在线观看| 久久亚洲精品网站| 久久精品亚洲精品| 97婷婷涩涩精品一区| 国产欧美日韩精品丝袜高跟鞋| 欧美精品免费播放| 欧美大尺度电影在线观看| 国产视频亚洲精品| 欧美日韩国产精品专区| 欧美最猛性xxxxx亚洲精品| 亚洲男人天堂手机在线| 久久免费成人精品视频| 久久激情视频免费观看| 久久手机免费视频| 91国产精品视频在线| 成人激情免费在线| 亚洲国产精品va在线看黑人动漫| 国产精品pans私拍| 成人a级免费视频| 久久免费视频在线| 久久青草福利网站| 久久久亚洲国产天美传媒修理工| 欧美精品在线免费播放| 精品国产成人在线| 国产精品日日摸夜夜添夜夜av| 日本久久久久久久| 国产美女久久久| 欧美影院成年免费版| 欧美中文字幕视频| 欧美激情手机在线视频| 久久国产加勒比精品无码| 国产欧美va欧美va香蕉在| 亚洲综合在线小说| 国产精品扒开腿做| 国产精品最新在线观看| 久久久久久久久久久成人| 午夜精品福利在线观看| 伊人成人开心激情综合网| 欧美性色19p| 亚洲国产高清自拍| xvideos亚洲人网站| 精品国产视频在线| 久久福利视频网| 国产精品久久久久久久久久ktv| 久久久女女女女999久久| 国产精品极品在线| 国产成人涩涩涩视频在线观看| 日韩第一页在线| 日韩一区二区三区xxxx| 91免费在线视频| 国产一区二区三区视频免费| 日韩视频―中文字幕| 日韩电影在线观看永久视频免费网站| 色无极影院亚洲| 久久久久久12| 韩国美女主播一区| 国产亚洲精品久久久久久牛牛| 欧美美最猛性xxxxxx| 一区二区三区视频在线| 色综合视频一区中文字幕| 久久国产精品久久久久| 亚洲人成在线观| 国产在线精品一区免费香蕉| 日韩av片永久免费网站| 精品久久久91| 亚洲在线视频观看| 国产在线视频91| 性金发美女69hd大尺寸| 欧美丰满老妇厨房牲生活| 久久国产色av| 欧美综合第一页| 国产+成+人+亚洲欧洲| 成人欧美一区二区三区在线| 91色视频在线导航| 欧美激情免费视频| 精品国产欧美成人夜夜嗨| 欧美片一区二区三区| 久青草国产97香蕉在线视频| 日韩在线精品视频| 日韩av在线不卡| 久久久人成影片一区二区三区观看| 欧美大片免费观看在线观看网站推荐| 日本精品在线视频| 欧美大片在线看免费观看| 最近日韩中文字幕中文| 国产欧美精品xxxx另类| 久热精品视频在线观看一区| 日韩欧美在线免费| 国产一区二区美女视频| 亚洲美女精品成人在线视频| 欧美日韩在线观看视频小说| 精品国产欧美一区二区三区成人| 欧美黄色免费网站| 欧美最顶级的aⅴ艳星| 日韩欧美综合在线视频| 亚洲成人黄色在线观看| 成人福利视频网| 亚洲国产成人精品久久久国产成人一区| 国产精品自拍小视频| 国产精品av在线播放| 欧亚精品中文字幕| 国模精品系列视频| 久久精品久久久久久国产 免费| 韩国美女主播一区| 久久久久久久久爱| 91高潮在线观看| 欧美国产日韩中文字幕在线| 亚洲黄色有码视频| 国产精品视频免费在线| 国产视频欧美视频| 国产午夜精品全部视频播放| 欧美性生交大片免费| 国产日韩欧美视频在线| 久久久女人电视剧免费播放下载| 亚洲欧美制服另类日韩| 日韩国产精品亚洲а∨天堂免| 国产精品v片在线观看不卡| 久久久久久久成人| 91精品国产91久久| 91精品视频在线看| 精品视频www|