于是在网上查,论文比较多,但都要收费,偶尔有几篇在前面的有一点信息。
于是就了下文:
其实讲了之后就非常简单,大家知道,图像是由一个一个像素组成的,每个像素又是由R(红)G(绿)B(蓝)三个亮度分量组成,每个分量又是一个8位二进数。
这个算法其实就是把信息按位替换这三个分量的最低几位,而对图像的视觉效果没什么特别的改变。
网上论文很多,论的大部份是隐藏效率问题。
其中效率比较高,而视觉隐响最小的替换是:R替换1位,B替换2位,G替换1位
下面的代码的作用是:把一段信息隐藏在.bmp格式中(当然还可隐藏到其它多媒体文件中),因为它比较好操作,没有进行压缩。
如果你是第一次接触,请到网上先了解bmp文件的结构,还要熟悉下面的知识
1. 位操作
2. 熟悉多媒体文件的结构
3. 熟练文件操作
贴代码了:(只是几个主要的涵数,比较乱,这个实现比较简单,就是修改了每个分量的最低位,听说这个算法还可以用来给图片加版权信息)
void mainok(FILE *fp_t)//修改最低1位
{
FILE *fp;
bits bits_;
bits bit_t;
BITMAPFILEHEADER header;
fp=fopen("QQ.bmp", "r+b");//要编辑的BMP文件
fread(&header, sizeof(header), 1, fp);
if(fp==NULL||fp_t==NULL)
{
printf("文件打开失败。\n");
return;
}
fseek(fp, 54, SEEK_SET);
int j=1;
while(1)
{
fread(&bits_, 1, 1, fp);
fread(&bit_t, 1, 1, fp_t);
//printf("a:%d ", ftell(fp));
//Sleep(100);
switch(j%8)
{
case 1:bits_.a1=bit_t.a1;break;
case 2:bits_.a1=bit_t.a2;break;
case 3:bits_.a1=bit_t.a3;break;
case 4:bits_.a1=bit_t.a4;break;
case 5:bits_.a1=bit_t.a5;break;
case 6:bits_.a1=bit_t.a6;break;
case 7:bits_.a1=bit_t.a7;break;
case 0:bits_.a1=bit_t.a8;break;
}
if(j%8!=0)
{
fseek(fp_t, -1, SEEK_CUR);
}
j++;
fseek(fp, -1, SEEK_CUR);
fwrite(&bits_, 1, 1, fp);
if(ftell(fp)==header.bfSize||feof(fp_t))
{
break;
}
fseek(fp, -1, SEEK_CUR);
fseek(fp, 1, SEEK_CUR);
}
fclose(fp);
}
void GetInformation() //信息提取函数
{
bits bit_i, bit_o;
FILE *fp, *fp_i, *fp_s;
fp=fopen("QQ.bmp", "rb");
fp_i=fopen("out.txt", "wb");
if(fp==NULL)
{
printf("信息文件打开失败\n");
return;
}
fseek(fp, 54, SEEK_SET);
long size=0;
GetFileSize("txt.txt", &size);
printf("%d", size);
int j=1;//信息计数器
while(j!=(size*8+1))
{
fread(&bit_i, 1, 1, fp);
switch(j%8)
{
case 1:bit_o.a1=bit_i.a1;break;
case 2:bit_o.a2=bit_i.a1;break;
case 3:bit_o.a3=bit_i.a1;break;
case 4:bit_o.a4=bit_i.a1;break;
case 5:bit_o.a5=bit_i.a1;break;
case 6:bit_o.a6=bit_i.a1;break;
case 7:bit_o.a7=bit_i.a1;break;
case 0:bit_o.a8=bit_i.a1;break;
}
if(j%8==0)
{
fwrite(&bit_o, 1, 1, fp_i);
}
j++;
}
fclose(fp);
printf("信息提取成功\n");
}
想要完整代码的:可给我留信息