概述
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文件的实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复