首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用VC++编的程序请

2012-01-22 
求助:用VC++编的程序请高手指点下面是关于(图像水印中的)往bmp图片中嵌入与提取的VC++代码,请大家帮忙看一

求助:用VC++编的程序请高手指点
下面是关于(图像水印中的)往bmp图片中嵌入与提取的VC++代码,请大家帮忙看一下,这是用的什么算法思想,请帮忙,谢谢了!

void   CDib::Embed()//嵌入
{
unsigned   char   bmdata;//bitmap   data
unsigned   char   efdata;//embeddedfile   data
int   t   =   7;
int   x[8];
int   s[8];
int   last_bit;   //记录字节最低位本来的bit

for(UINT   i1   =   0,   i2   =   0;   i1   <=   bitmap_size   -   1,   i2   <=   embfile_size   -   1;   i1++)
{
bmdata   =   *p;

for   (int   j   =   0;   j   <=   7;   j++)   //计算各bit位
{
x[j]   =   bmdata   &   1;
bmdata   > > =   1;
}

last_bit   =   x[0];
x[0]   =   x[1]   ^   x[2]   ^   x[3]   ^   x[4]   ^   x[5]   ^   x[6]   ^   x[7];

if   (t   ==   7)         //宿主图片每走过八个字节,计算一次s[]
{
efdata   =   *q;
for   (j   =   0;   j   <=   7;   j++)
{
s[j]   =   efdata   &   1;
efdata   > > =   1;
}
}
x[0]   ^=   s[t];//隐藏信息
if   (last_bit   ==   0)     //嵌入隐藏信息
{
*p   |=   x[0];
}
else
{
*p   &=   254   +   x[0];
}

p++;
t--;
if   (t   ==   -1)     //需要计算一次s[]
{
t   =   7;
q++;
i2++;
}
}

}

void   CDib::Pick()//提取
{
m_pFile   =   new   unsigned   char   [embfile_size];
unsigned   char   *q   =   m_pFile;

unsigned   char   bmdata;//bitmap   data

int   x[8];
int   s[8];
int   t   =   7;
for   (UINT   i1   =   0,   i2   =   0;   i1   <=   bitmap_size   -   1,   i2   <=   embfile_size   -   1;   i1++)
{
bmdata   =   *p;
for   (int   j   =   0;   j   <=   7;   j++)   //计算各bit位
{
x[j]   =   bmdata   &   1;
bmdata   > > =   1;
}
s[t]   =   x[0]   ^   x[1]   ^   x[2]   ^   x[3]   ^   x[4]   ^   x[5]   ^   x[6]   ^   x[7];
t--;
if   (t   ==   -1)   //s[7]到s[0]组成一个字节
{
*q   =   s[7]   *   128   +   s[6]   *   64   +   s[5]   *   32   +   s[4]   *   16   +  
s[3]   *   8   +   s[2]   *   4   +   s[1]   *   2   +   s[0];
t   =   7;
i2++;
q++;
}
p++;
}

}


[解决办法]
假设Bmp文件就只有一个像素,照着程序自己手算一下,看看嵌入之后像素是怎么变化的.........
[解决办法]
*p是取出p所指内存地址上存入的内容,所以bmdata = *p是完全合乎语法的,因为两边都是unsigned char。每处理完一个像素,p指向下一个像素(通过倒数第3行的p++),p向地址增加的方向发展。

调试的时候,当执行完bmdata = *p后,把鼠标指向bmdata就可以显示出bmdata的值,不就看出来了...

热点排行