图像水印的LSB算法,VC++代码
下面是关于数字图像水印的LSB算法,往bmp图片中嵌入与提取的VC++代码,跪求高人给我讲讲它的运算与操作过程,万分感谢!voidCDib::Embed()//嵌入{un...
下面是关于数字图像水印的LSB算法,往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++;
}
} 展开
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++;
}
} 展开
3个回答
展开全部
因为8位像素值的最低位为1或0对整个像素值影响不大,LSB就是把水印信息放入这个最低位,同时保证原始图像基本无变化
void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP图像数据
unsigned char efdata;//嵌入的文件数据
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;//p指向图像数据的每个像素,把当前像素值给bmdata
for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}
last_bit = x[0];//原始图像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等于其他各位的异或
if (t == 7) //宿主图片每走过八个字节,计算一次s[]
{
efdata = *q;//q指向插入的水印数据
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印数据依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隐藏信息,隐藏信息等于原图像高六位的异或再和文件数据异或
if (last_bit == 0) //嵌入隐藏信息
{
*p |= x[0];//如果该像素原本最低位为0;则将最终得到的异或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果该像素原本最低位为1;则将最终得到的异或水印值放入原像素
}
p++;//指向下一个像素
t--;//t用来定时每8个字节插入一次完整的s
if (t == -1) //需要计算一次s[]
{
t = 7;
q++;//指向下一个作为待插入水印的文件数据
i2++;
}
}
}
void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//开辟等于插入文件数据大小的内存
unsigned char *q = m_pFile;//q指向该内存
unsigned char bmdata;//插入了水印的BMP图像数据
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; //p指向插入了水印的图像数据
for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提取该图像字节的0~7位放入X[]数组
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8个字节中的s[]
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++;//指向下一像素
}
}
void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP图像数据
unsigned char efdata;//嵌入的文件数据
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;//p指向图像数据的每个像素,把当前像素值给bmdata
for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}
last_bit = x[0];//原始图像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等于其他各位的异或
if (t == 7) //宿主图片每走过八个字节,计算一次s[]
{
efdata = *q;//q指向插入的水印数据
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印数据依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隐藏信息,隐藏信息等于原图像高六位的异或再和文件数据异或
if (last_bit == 0) //嵌入隐藏信息
{
*p |= x[0];//如果该像素原本最低位为0;则将最终得到的异或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果该像素原本最低位为1;则将最终得到的异或水印值放入原像素
}
p++;//指向下一个像素
t--;//t用来定时每8个字节插入一次完整的s
if (t == -1) //需要计算一次s[]
{
t = 7;
q++;//指向下一个作为待插入水印的文件数据
i2++;
}
}
}
void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//开辟等于插入文件数据大小的内存
unsigned char *q = m_pFile;//q指向该内存
unsigned char bmdata;//插入了水印的BMP图像数据
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; //p指向插入了水印的图像数据
for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提取该图像字节的0~7位放入X[]数组
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8个字节中的s[]
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++;//指向下一像素
}
}
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
2010-05-29
展开全部
void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP图像数据
unsigned char efdata;//嵌入的文件数据
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;//p指向图像数据的每个像素,把当前像素值给bmdata
{
unsigned char bmdata;//BMP图像数据
unsigned char efdata;//嵌入的文件数据
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;//p指向图像数据的每个像素,把当前像素值给bmdata
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问的真够笼统的,可以M我,就勉为其难和你说说
我不会全写出来的
我不会全写出来的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询