图像水印,请高手指点!!
下面是关于(图像水印中的)往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++;
}
}
[解决办法]
不知道,帮顶
[解决办法]
首先,这个算法只改动图像每个byte最后一个bit,对图像质量影响就不大。
其次,他把水映的每个byte拆开,1个bit 1个bit 的作,
算法可能是根据循环编码之类的方法.
[解决办法]
看样子是最简单的修改最低有效位的水印算法,利用最低位对图像的贡献不大,修改它可以较好的隐藏水印信息。
[解决办法]
这个实际上不能算严格的数字水印,因为数字水印有4个特征。不可见性;水印容量;排他性。
鲁棒性 ,实际上这个代码不具有排他性和鲁棒性 。因为一: 在嵌入了水印后,我们还可以嵌入其他水印。二:在对图像进行滤波,平滑等处理后,水印信息丢失。
[解决办法]
我用的是VB写的,所以不存在gif转换为bmp的难题,直接用stdpicture对象就可以了。
[解决办法]
数字水印并不一定要拥有楼上的楼上说的所有特性的,根据应用的不同,会有具有不同特性的数字水印的.
[解决办法]
string extension = Path.GetExtension(File1.PostedFile.FileName).ToUpper();
string fileName = DateTime.Now.ToString( "yyyyMMddhhmmss ");
string path = Server.MapPath( ". ") + "/upload/ " + fileName + extension;
File1.PostedFile.SaveAs(path);
System.Drawing.Image image = System.Drawing.Image.FromFile(path);
System.Drawing.Image copyImage = System.Drawing.Image.FromFile( Server.MapPath( ". ") + "/logo.gif ");
//Create a new FrameDimension object from this image
FrameDimension ImgFrmDim = new FrameDimension( image.FrameDimensionsList[0] );
int nFrameCount = image.GetFrameCount( ImgFrmDim );
// Save every frame into jpeg format
for( int i = 0; i < nFrameCount; i++ )
{
image.SelectActiveFrame( ImgFrmDim, i );
image.Save( string.Format( Server.MapPath( ". ") + "/upload/Frame{0}.jpg ", i ), ImageFormat.Jpeg );
}
image.Dispose();
for( int i = 0; i < nFrameCount; i++ )
{
string pa = Server.MapPath( ". ") + "/upload/Frame "+i+ ".jpg ";
System.Drawing.Image Image = System.Drawing.Image.FromFile(pa);
Graphics g = Graphics.FromImage(Image);
g.DrawImage(copyImage, new Rectangle(Image.Width-copyImage.Width, Image.Height-copyImage.Height,
copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
g.Dispose();
string newPath = Server.MapPath( ". ") + "/upload/ " + fileName + "_new "+i.ToString()+ extension;
Image.Save(newPath);
Image.Dispose();
if(File.Exists(pa))
{
File.Delete(pa);
}
}
if(File.Exists(path))
{
File.Delete(path);
}
[解决办法]
if (last_bit == 0)
{
*p |= x[0];
}
else
{
*p &= 254 + x[0];
}
这段看不明白啊,看下面提取的部分,应该是*p = (*p&0xFE)| x[0];啊
[解决办法]
if (last_bit == 0)
{
*p |= x[0];
}
else
{
*p &= 254 + x[0];
}
有谁弄明白这个算法了?留个QQ呀.小弟想请教一下了.
[解决办法]
是基于LSB算法,将原始图像每个字节的高7位依次异或;后再用原始图像象素字节位异或结果与水印图像依次字节位异或后写入原始图像最低位。
[解决办法]
对,这就是LSB算法,不过我觉得不是很好,我毕业设计也是做数字水印,这种方法效果不好,现在基本不用了