求助:用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的值,不就看出来了...