我是靠谱客的博主 整齐睫毛膏,最近开发中收集的这篇文章主要介绍基于NODE.JS的LSB写隐技术在BMP文件的实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

BMP文件中每个像素使用RGB来表示, LSB(Least Significant Bit)最低有效位对应每个颜色的最低位。颜色的范围是0-255,人眼分辨不出+1/-1的变化。

相关知识点:

1. BMP文件格式;

1. node.js文件;

2.node.js的Buffer;

直接上代码!

为BMP文件添加信息的函数:

/**
 * fileInput:需要写入信息的BMP文件;
 * fileOutput:写好信息后的BMP文件;
 * content:需要写入的信息;
 */
exports.addWaterMark = function ( fileInput,fileOutput,content ){
    //先检查下是否是个文件
    fs.stat( fileInput,function(err,stats) {
        if (err) {
            console.log(err.toString());
            return;
        } else {
            if ( !stats.isFile() ) {
                console.log( fileInput + ' is not a file!');
                return;
            }
        }
    });

    //没有信息的话就直接回去了
    if( content.length==0 )
        return;

    //读文件并且向里面添加内容,addMark函数在后面
    fs.readFile( fileInput,function (err,data){
        if( err )
        {
            console.log(err.toString());
            return;
        }
        addMark(data,content,fileOutput);
    } );
};

 

//添加信息的函数
//data--文件内容,这个就是fs.readFile那个回调函数的data
//content--文件内容;
//fileOutput-输出文件
function addMark(data,content,fileOutput){
    //检查文件标志‘BM’--BMP文件标志
    if( data[0]!=0x42 | data[1]!=0x4D )
        return;

    let i,j,ch1,ch2,index,bitLength;
    let startIndex = 54;//BMP文件的图像数据是从第54Byte开始的

    //添加标志信息(010101),有这个的话表示这个文件已经被写入过信息了
    data[startIndex]   = data[startIndex]   & 0b1110;
    data[startIndex+1] = data[startIndex+1] | 0b0001;
    data[startIndex+2] = data[startIndex+2] & 0b1110;
    data[startIndex+3] = data[startIndex+3] | 0b0001;
    data[startIndex+4] = data[startIndex+4] & 0b1110;
    data[startIndex+5] = data[startIndex+5] | 0b0001;

    //使用Buffer
    let buf = Buffer.from( content,'utf-8' );

    //计算并存储内容长度信息--32位
    index = startIndex + 6;
    bitLength = 8*buf.length;
    for( i=0;i<32;i++ )
    {
        data[index] = data[index] & 0b1110;
        data[index] = data[index] | ( (bitLength>>i) & 0x0001 );
        index++;
    }

    //添加内容
    index = startIndex + 38;
    for( i=0;i<buf.length;i++ )
    {
        ch1 = buf[i];
        for( j=0;j<8;j++ )
        {
            ch2 = data[index];
            ch2 = ( ch2 & 0b1110 );//set last bit to 0
            data[index] = ( ch2 + ((ch1>>j) & 0x01) );
            index++;
        }
    }

    if( fs.existsSync(fileOutput) )
        fs.unlinkSync( fileOutput );

    //写入BMP文件
    fs.writeFile( fileOutput,data,function (err){
        if( err )
            console.log(err);
    });
};

 

 

从BMP获取写入的内容:

//fileInput:BMP文件

exports.getWaterMark = function ( fileInput ) {
    let content;
    //check file is a file
    fs.stat( fileInput,function(err,stats) {
        if (err) {
            console.log(err.toString());
            return;
        } else {
            if ( !stats.isFile() ) {
                console.log( fileInput + ' is not a file!');
                return;
            }
        }
    });

    //调用getMark函数,并得到写入的内容,getMark函数在下面
    return getMark( fs.readFileSync(fileInput) );
};

 

//data--文件内容, fs.readFileSync(fileInput)读出来的文件数据

function getMark(data){
    if( data[0]!=0x42 | data[1]!=0x4D )
        return;

    let i,j,index,bitLength,byteLength;
    let content;

    //检查是否被标记过(010101)
    let startIndex = 54;
    if( ( (data[startIndex]   & 0x01)==0 ) &&
        ( (data[startIndex+1] & 0x01)==1 ) &&
        ( (data[startIndex+2] & 0x01)==0 ) &&
        ( (data[startIndex+3] & 0x01)==1 ) &&
        ( (data[startIndex+4] & 0x01)==0 ) &&
        ( (data[startIndex+5] & 0x01)==1 )  )
    {
        //获取内容的长度
        index = startIndex + 6;
        bitLength = 0;
        for( i=0;i<32;i++ )
        {
            bitLength = bitLength | (((data[index] & 0b0001))<<i);
            index++;
        }

        //获取内容
        byteLength = bitLength/8;
        index = startIndex + 38;
        let buf = Buffer.alloc( byteLength );
        for( i=0;i<byteLength;i++ )
        {
            for( j=0;j<8;j++ )
            {
                buf[i] = buf[i] | (( data[index] & 0x01 )<<j );
                index++;
            }
        }
        content = buf.toString('utf-8');
    }

    return content;
};

最后

以上就是整齐睫毛膏为你收集整理的基于NODE.JS的LSB写隐技术在BMP文件的实现的全部内容,希望文章能够帮你解决基于NODE.JS的LSB写隐技术在BMP文件的实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部