要件に遭遇しました。実際のタイプのJPGを含む画像ファイルがあり、誰かがJPGを直接コピーして同じ名前のPNGファイルとして保存するのが面倒だとします。このようにして、ファイルAS3を読むときに問題はありませんが、携帯電話のC ++はファイルを読むときに問題に遭遇します - !
これで、フォルダー内のすべてのファイルをトラバースし、「珍しい」ファイル形式のファイルを見つけるプログラムを作成する必要があります。当社のリソースは、主にGIF、PNG、およびJPGです。最初に、オンラインで記事を見つけました。バイナリストリームとファイルヘッダーに基づいてファイルタイプMIMEタイプを取得し、ファイルバイナリのヘッダー情報を読み取り、実際のファイルタイプを取得し、サフィックス名で取得したファイルタイプと比較します。
コードコピーは次のとおりです。
var fd = fs.opensync(new_file_path、 'r');
varバッファー=新しいバッファー(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 = "unknoking 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モジュールランキング>>(画像)
次に、モジュール「node-imageinfo」をフィルタリングし、テストの例を書きました(jpgファイルのサフィックス名をPNGに直接直接変更する):
そのソースコード、興味がある場合は、それを研究できます。
コードコピーは次のとおりです。
function readuint32(バッファー、オフセット、ビッグエンディアン){
if(buffer.readuint32){
return buffer.readuint32(offset、bigendian);
}
var値;
if(bigendian){
if(buffer.readuint32be){
return buffer.readuint32be(offset);
}
値=(バッファー[オフセット] << 24) +(バッファー[オフセット + 1] << 16) +(バッファー[オフセット + 2] << 8) +バッファー[オフセット + 3];
}
それ以外 {
if(buffer.readuint32le){
return buffer.readuint32le(offset);
}
値=バッファー[オフセット] +(バッファー[オフセット + 1] << 8) +(バッファー[オフセット + 2] << 16) +(バッファー[オフセット + 3] << 24);
}
返品値。
}
function readuint16(バッファー、オフセット、ビッグエンディアン){
if(buffer.readuint16){
return buffer.readuint16(offset、bigendian);
}
var値;
if(bigendian){
if(buffer.readuint16be){
return buffer.readuint16be(offset);
}
値=(バッファー[オフセット] << 8) +バッファー[オフセット + 1];
}
それ以外 {
if(buffer.readuint16le){
return buffer.readuint16le(offset);
}
値=バッファー[オフセット] +(バッファー[オフセット + 1] << 8);
}
返品値。
}
function readbit(バッファ、オフセット、ビットオフセット){
if(bitoffset> 7){
offset += math.floor(bitoffset / 8);
BitOffset = BitOffset%8;
}
var b =バッファー[オフセット];
if(bitoffset <7){
b >>> =(7-ビットオフセット);
}
var val = b&0x01;
valを返します。
}
関数readbits(バッファー、オフセット、ビットオフセット、ビットレン、署名){
var val = 0;
var neg = false;
if(署名){
if(readbit(buffer、offset、bitoffset)> 0){
neg = true;
}
Bitlen-;
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 = new Buffer(バイト);
Val.Negative = neg?true:false;
valを返します。
}
関数ImageInfopng(バッファー){
var imageheader = [0x49、0x48、0x44、0x52]、
POS = 12;
if(!checksig(buffer、pos、imageheader)){
falseを返します。
}
POS += 4;
戻る {
タイプ:「画像」、
フォーマット: 'png'、
MIMETYPE: 'image/png'、
幅:Readuint32(バッファ、PO、TRUE)、
高さ:Readuint32(バッファー、POS+4、TRUE)、
};
}
関数ImageInfojpg(バッファ){
var pos = 2、
len = buffer.length、
sizesig = [0xff、[0xc0、0xc2]];
while(pos <len){
if(checksig(buffer、pos、sizesig)){
pos += 5;
戻る {
タイプ:「画像」、
形式: 'jpg'、
MimeType: 'image/jpeg'、
幅:Readuint16(バッファー、POS+2、TRUE)、
高さ:Readuint16(バッファ、POS、TRUE)、
};
}
POS += 2;
var size = readuint16(buffer、pos、true);
pos += size;
}
}
関数ImageInfogif(バッファー){
var pos = 6;
戻る {
タイプ:「画像」、
フォーマット: 'gif'、
MIMETYPE: 'Image/gif'、
幅:Readuint16(バッファ、PO、false)、
高さ:Readuint16(バッファー、POS+2、FALSE)、
};
}
関数ImageInfoswf(バッファー){
var pos = 8、
bitpos = 0、
val;
if(buffer [0] === 0x43){
試す {
// ZLIBを使用できる場合(npmインストールzlib)、圧縮フラッシュファイルを読み取ることができます
バッファ= require( 'zlib')。インフレ(buffer.slice(8、100));
pos = 0;
}
catch(ex){
//圧縮フラッシュファイルの幅/高さを取得できません...まだ(ZLIBが必要です)
戻る {
タイプ:「フラッシュ」、
形式:「SWF」、
MIMETYPE: 'アプリケーション/X-ShockWave-Flash'、
幅: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);
戻る {
タイプ:「フラッシュ」、
形式:「SWF」、
MIMETYPE: 'アプリケーション/X-ShockWave-Flash'、
幅:math.ceil((xmax -xmin) / 20)、
高さ:math.ceil((ymax -ymin) / 20)、
};
}
function checksig(バッファー、オフセット、sig){
var len = sig.length;
for(var i = 0; i <len; i ++){
var b =バッファー[i+offset]、
s = sig [i]、
m = false;
if( 'number' == typeof s){
m = s === b;
}
それ以外 {
for(var k in s){
var o = s [k];
if(o === b){
m = true;
}
}
}
if(!m){
falseを返します。
}
}
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);
falseを返します。
};