在使用微信机器人的时候遇到一个需要进行图片转发的场景,但是微信的图片都不是以图片的形式存储的,所以需要进行一次转换。

计算好偏移量然后利用node的fs模块即可

//修改图片
let fs = require('fs');
let path = require('path');

//值是多少自己算。
let base = 0xFF;
let next = 0xD8;
let gifA = 0x47;
let gifB = 0x49;
let pngA = 0x89;
let pngB = 0x50;
let bmpA = 0x42;
let bmpB = 0x4d;

//convert
let convert = (item,cb) => {
    console.log(item)
    let extname = '.jpg';
    fs.readFile(item, (err,content) => {
        if(err){
            console.log('解码失败:' + item);
            cb(null);
        }else{
            let firstV = content[0],
                nextV = content[1],
                jT = firstV ^ base,
                jB = nextV ^ next,
                gT = firstV ^ gifA,
                gB = nextV ^ gifB,
                pT = firstV ^ pngA,
                pB = nextV ^ pngB;
                bT = firstV ^ bmpA;
                bB = nextV ^ bmpB;
            var v = firstV ^ base;
            if(jT == jB){
                v = jT;
                extname = '.jpg';
            }else if(gT == gB){
                v = gT;
                extname = '.gif';
            }else if(pT == pB){
                v = pT;
                extname = '.png';
            }else if(bT == bB){
                v = bT;
                extname = '.bmp';
            }
            let imgPath = path.join(path.dirname(item),path.basename(item)+extname);
            let bb = content.map( br => {
                return br ^ v
            })
            fs.writeFileSync(imgPath,bb)
            // 直接往回调里传个图片地址,方便发送
            cb(path.join(imgPath);
        }
  
    })
}

module.exports = {
    convert
}

然后直接调用

const decoder = require('./lib/decoder');
const path = require('path')

decoder.convert(`${path.resolve(__dirname, '.')}\\3d21b0d1ab3d829da41ea93fcb976c1c.dat`, item => {
    console.log(item)
})
最后修改:2022 年 10 月 05 日
如果觉得我的文章对你有用,请随意赞赏