精华内容
下载资源
问答
  • 提出了一种应用于医学图像认证的基于Weber准则的脆弱盲水印技术,基于Weber准则选择图像中的像素并插入脆弱水印。由于这种水印技术只选择和改变图像中的暗像素,因此不会造成图像的明显改变。这种水印技术能够鉴定...
  • 为了解决奇异值最高位在几何攻击下易敏感性和零水印抗几何攻击性能差的问题,提出一种基于改进奇异值和子块映射的图像零水印技术。首先,对载体图像进行Arnold置乱处理,消除像素间的相关性。然后,进行Curvelet变换、...
  • 息值修改二维码图像的像素值,实现水印信息的嵌入和提取。实验结果表明,相比同类算法,根据本文提出的方法嵌入 水印后的图像具有更高的质量和更大的水印容量。同时,该方法具有较好的抗JPEG压缩和抗打印扫描的鲁棒...
  • 为了验证图像的真实性和完整性,提出了一种基于像素点灰度值奇偶性的脆弱水印技术。选取一些像素点,通过判断并调整这些像素点的灰度值奇偶性达到嵌入水印图像位信息的目的。根据提取的水印图像可以验证被检测图像...
  • 利用BMP图片水印技术写入加密信息

    千次阅读 2013-12-04 17:02:54
    本文主要和大家讨论一下BMP图片水印技术。其实BMP图片水印技术就是在BMP图片中写入编码后的数据,但写入数据后的图片在外观上和原始图片没有区别(只有文件哈希值改变),并能用特定的程序将写入的信息还原出来。 ...

    本文主要和大家讨论一下BMP图片水印技术。其实BMP图片水印技术就是在BMP图片中写入编码后的数据,但写入数据后的图片在外观上和原始图片没有区别(只有文件哈希值改变),并能用特定的程序将写入的信息还原出来。
     
    BMP图片规格
        BMP图片存放时按照每个像素的RGB信息存储,每个像素的颜色用一个字节(8bit)存放。BMP图片的文件头如图1和图2所示。
    图1
    图2
    0x42、0x4D表示BMP图片的标识;0x36、0x09、0x00、0x00表示BMP图片的文件大小;0x36、0x00、0x00、0x00表示BMP图片的数据区从第几个字节开始;0x00、0x02、0x00、0x00表示BMP图片的像素宽度;0x80、0x01、0x00、0x00表示BMP图片的像素高度;0x18、0x00、0x00、0x00表示BMP图片的每个点的像素值。以上这些特殊字节都是记录BMP图片信息的地方,是不能进行修改的,这就是BMP图片文件头的格式。虽然BMP图片中的一些特殊字节是我们不能修改的,但是BMP图片的数据区是可以修改的,数据区如图3所示,从55字节处开始,其中0xFF、0x00、0x00分别表示RGB信息(0~255)。
    图3
     
    程序原理
    我实现程序的基本原理就是将要写入图片的信息逐一进行二进制编码后,分别写入RGB字节的末尾。例如要将a写入图片中,a的ASCII码97,二进制为0110 0001,原始图片的第55个字节数据区开始的8个字节的信息分别为0x00、0xFF、0x00、0x00、0xFF、0x00、0x00和0xFF,将a的二进制编码写入(为方便起见,编码我采取从右到左的顺序写入),如图4所示。
    图4
    编码时只需要将二进制写入RGB的末尾,若1写入0x00,只需将“0000 | 0001=0001”,此时0x00就变为0x01;若0写入0xFF,只需将“11111111 & 11111110=11111110”,此时0xFF就变为0xFE。以此类推,这样就可以将a的二进制编码写入RGB的末尾了。由于颜色变化仅仅为0xFF变为0xFE,肉眼是无法分辨出来的。写入a后的图片如图5所示。但是在进行汉字编码的时候,由于汉字使用的是Unicode编码,且由两个负数组成,所以必须加入汉字标识位。
    图5
    写入代码实现
    void write_information()
    {
    FILE *fp,*ip; //定义了指向BMP图片和文本文件的文件指针
    int i=0,input_temp[8]={0,0,0,0,0,0,0,0},j,t=0,x,y,text_ch=0;
    int Re_size,input_pointer,bmp_size;
    unsigned char bmp_data[8];
    char input_data;
    //打开BMP图片文件
    if((fp=fopen(FileName,"r+b"))==NULL)
    {
    printf("-->打开BMP文件错误");
    exit(1);
    }
    //打开txt文本文件
    if((ip=fopen("input.txt","r"))==NULL)
    {
    printf("-->打开input文件错误");
    exit(1);
    }
    //判断文本文件大小是否能写入图片,Re_size为返回是否写入判断值
    Re_size=Txt_size();
    If(Re_size==0)
    {
    exit(1);
    }
    //得到输入的文本文件的大小,input_pointer为文件指针的位置
    fseek(ip,0,SEEK_END);
    input_pointer=ftell(ip);
    if(input_pointer==0)
    {
    printf("-->input.txt文件中的内容为空,请写入数据");
    exit(1);
    }
    printf("-->input.txt文件中现在有:%d个字节",input_pointer);
    rewind(ip);
    //得到BMP图片的大小,bmp_size为BMP图片文件的大小
    fseek(fp,0,SEEK_END);
    bmp_size=ftell(fp);
    rewind(fp);
    }
    //将文件指针指向数据区
    fseek(fp,55,SEEK_SET);
    //清除缓存中的数据流(此函数重要,没有此函数读数据时会有乱码)
    fflush(fp);
    //进入写入水印数据操作
    do
    {//读取BMP图片中8个字节的信息,并存入一个临时数组中
    for(j=0;j<8;j++)
    {
    fread(&bmp_data[j],sizeof(unsigned char),1,fp);
    }
    //将BMP图片指针回8个字节
    fseek(fp,-8,SEEK_CUR);
    //读取Txt文本文件中的数据
    fread(&input_data,sizeof(char),1,ip);
    //得到Txt文本读取数据的ASCII值
    input_data=(int)input_data;
    //判断是字符还是汉字
    if(input_data<0)
    {
    //汉字标识位
    text_ch=-1;
    input_data=(input_data*-1);
    }
    j=7;
    //将Txt文本数据转换为二进制
    do
    {
    input_temp[j]=input_data%2;
    //如果是二进制0,将0写入RGB字节末尾
    if(input_temp[j]==0)
    {
    bmp_data[t]=(bmp_data[t]&254);
    fwrite(&bmp_data[t],sizeof(unsigned char),1,fp);
    t++;
    }
    //如果是二进制1,将1写入RGB字节末尾
    if(input_temp[j]==1)
    {
    bmp_data[t]=(bmp_data[t]|1);
    fwrite(&bmp_data[t],sizeof(unsigned char),1,fp);
    t++;
    }
    input_data=input_data/2;
    j--;
    }while(input_data!=0);
    For(y=0;y<(j+1);y++)
    {//处理Unicode编码的中文汉字,在中文标识位上写入标识1
    if(text_ch==-1&&y==j)
    {
    bmp_data[t]=(bmp_data[t]|1);
    fwrite(&bmp_data[t],sizeof(unsigned char),1,fp);
    t++;
    text_ch=0;
    break;
    }
    //转换后的二进制不足八位其余位补0
    bmp_data[t]=(bmp_data[t]&254);
    fwrite(&bmp_data[t],sizeof(unsigned char),1,fp);
    t++;
    }
    j=7;
    t=0;
    fflush(fp);
    //恢复临时文本数组
    for(x=0;x<8;x++)
    {
    input_temp[x]=0;
    }
    i++;
    }while(i!=input_pointer);

    读取代码实现
    void read_information()
    {
    FILE *fp;
    int i,j=55,t,temp=1,k,add=0,show[2]={0,0},inshow,x=0,y;
    unsigned char bmp_data[8]={0,0,0,0,0,0,0,0};
    if((fp=fopen(FileName,"r+b"))==NULL)
    {
    printf("-->打开BMP图片文件错误");
    exit(1);
    }
    fseek(fp,55,SEEK_SET);
    //清除缓存中的数据流(此函数重要,没有此函数读数据时会有乱码)
    fflush(fp);
    do
    {
    //将BMP图片RGB信息读取出来
    for(i=0;i<8;i++)
    {
    fread(&bmp_data[i],sizeof(unsigned char),1,fp);
    j++;
    }
    //判断读取完毕的条件
    if(j>end_pointer)
    {
    break;
    }
    //将二进制信息从RGB末字节处取出
    for(t=0;t<8;t++)
    {
    bmp_data[t]=(bmp_data[t]&1);
    }
    //将二进制信息还原
    add=bmp_data[0]*1;
    for(k=1;k<7;k++)
    {
    temp*=2;
    add+=(bmp_data[k]*temp);
    }
    //判断是否是中文编码的字符
    if(bmp_data[7]==0)
    {
    inshow=add;
    printf("%c",inshow);
    }
    if(bmp_data[7]==1)
    {
    show[x]=add;
    show[x]=(show[x]*-1);
    x++;
    }
    //还原临时BMP图片数组初始值
    for(y=0;y<8;y++)
    {
    bmp_data[y]=0;
    }
    temp=1;
    add=0;
    //显示中文字符
    if(x==2)
    {
    printf("%c%c",show[0],show[1]);
    x=0;
    }
    }while(1);
    printf("-->读出BMP图片文件中的信息完成");
    fcloseall();
    }
    总结
    在BMP图片中写入水印,只要从数据区55个字节以后都可以每8个RGB字节末尾写入二进制信息,如0xFF变为0xFE(Red值从255变为254),这样图片的变化情况是无法用肉眼来分辨的,只有文件的哈希值会改变,这样就能将一些加密信息写入其中了
    展开全文
  • 通过将水印嵌入点的宿主图像的像素值更改为其近邻像素值的均值,而实现“盲水印”的提取。数值计算结果表明:该水印计算法对像素变换攻击具有很强的鲁棒性,如图像亮度、对比度和灰度曲线的调整;能抵抗JPEG有损压缩、...
  • 图片水印加密技术——就是将文字信息转化为对应的二进制信息后,写入BMP图片中,例如某文字的二进制码为01001001,则分别将0、1、0、0、1、0、0、1写入bmp图片的八个像素中,从而达到隐藏信息的作用,最后也可用特定...

      记得在很久以前,听过一个朋友说过图片水印加密技术(他好像也是从书上看来的),图片水印加密技术——就是将文字信息转化为对应的二进制信息后,写入BMP图片中,例如某文字的二进制码为01001001,则分别将0、1、0、0、1、0、0、1写入bmp图片的八个像素中,从而达到隐藏信息的作用,最后也可用特定的程序将信息还原。

              但在他告诉我的方法中,对文本编码方式有特殊要求,特别是中文——必须是GB2312编码,否则还原后的文字将是乱码。并且,仅仅这样对文字进行隐藏是不太安全的,对方只要有一个类似的加解密软件,便可将信息全部还原。

              我在研究这种算法一段时间后,有了一些想法——我们可以现将文本信息进行一次AES加密(或其他的加密算法)后,在将加密后的密文写入bmp图片中。这样对文本信息进行处理后,密文既有隐藏式加密的隐秘性,又有算法式加密的复杂性,可谓是一种更强的加密方式!

    因此,我将我的方法写成了一个.net类库,并改进了文本的二进制编码方式,使其不受特定编码的限制。

    以下是代码,望高手赐教!!

    (类库中包含AES加密模块,也可改为其他加密算法)

     

     

    代码
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text
    Imports System.IO
    Imports System.Runtime.Serialization.Formatters

    Public Class AesWithBMP

    <Serializable()> Public Structure KeyFileStructure ‘可用此结构来创建一个密钥文件
    Public strKey As String ’密钥
    Public strIV As String ‘初始向量
    Public IsEnCryptWithBMP As Boolean ’是否写入bmp图片
    Public IsInputBMPWithEnCrypt As Boolean ‘写入bmp图片的内容是否经过AES加密
    End Structure

    Public Sub CreateKeyFile(ByVal strKey As String, ByVal strIV As String, ByVal IsEnCryptWithBMP As Boolean, ByVal IsInputBMPWithEnCrypt As Boolean, ByVal KeySaveName As String, Optional ByVal IsRewriteKeyFile As Boolean = False) ’此函数用于在指定路径创建一个密钥文件

    Dim fStream As FileStream = Nothing

    Try

    If Not File.Exists(KeySaveName) Then

    Dim KeyStructure As New KeyFileStructure
    With KeyStructure
    .strKey
    = strKey
    .strIV
    = strIV
    .IsEnCryptWithBMP
    = IsEnCryptWithBMP
    .IsInputBMPWithEnCrypt
    = IsInputBMPWithEnCrypt
    End With

    Dim kFomatter As New Binary.BinaryFormatter

    fStream
    = New FileStream(KeySaveName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

    kFomatter.Serialize(fStream, KeyStructure) ‘将密钥结构序列化

    Else

    If IsRewriteKeyFile Then ’当发现同名密钥文件时是否覆盖

    Dim KeyStructure As New KeyFileStructure
    With KeyStructure
    .strKey
    = strKey
    .strIV
    = strIV
    .IsEnCryptWithBMP
    = IsEnCryptWithBMP
    .IsInputBMPWithEnCrypt
    = IsInputBMPWithEnCrypt
    End With

    Dim kFomatter As New Binary.BinaryFormatter

    fStream
    = New FileStream(KeySaveName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

    kFomatter.Serialize(fStream, KeyStructure)

    KeyStructure
    = Nothing

    End If

    End If

    Finally

    If fStream IsNot Nothing Then fStream.Close()

    End Try

    End Sub

    Public Sub GetKeyFile(ByVal SBKName As String, ByRef out_KeyFile As KeyFileStructure) ‘此过程用于从密钥文件中获取密钥等信息

    Dim fStream As FileStream = Nothing

    Try

    Dim kFomatter As New Binary.BinaryFormatter
    fStream
    = New FileStream(SBKName, FileMode.Open, FileAccess.Read)

    out_KeyFile
    = kFomatter.Deserialize(fStream)

    Finally

    If fStream IsNot Nothing Then fStream.Close()

    End Try

    End Sub


    Private Sub EnCrypt(ByVal SourceFileName As String, ByVal ResultFileName As String, ByVal Key As String, ByVal IV As String) ’对指定文件进行AES加密,并保存到指定路径

    Dim myCryptoStream As CryptoStream = Nothing
    Dim SourceFileStream As FileStream = Nothing
    Dim ResultFileStream As FileStream = Nothing
    Dim myAESProvider As AesCryptoServiceProvider = Nothing

    Try

    myAESProvider
    = New AesCryptoServiceProvider

    myAESProvider.Key
    = ASCIIEncoding.ASCII.GetBytes(Key)
    myAESProvider.IV
    = ASCIIEncoding.ASCII.GetBytes(IV)

    Dim myICryptoTransform As ICryptoTransform = myAESProvider.CreateEncryptor(myAESProvider.Key, myAESProvider.IV)

    SourceFileStream
    = New FileStream(SourceFileName, FileMode.Open, FileAccess.Read, FileShare.None)

    ResultFileStream
    = New FileStream(ResultFileName, FileMode.Create, FileAccess.Write)

    myCryptoStream
    = New CryptoStream(ResultFileStream, myICryptoTransform, CryptoStreamMode.Write)

    Dim InputByteArray(SourceFileStream.Length - 1) As Byte

    SourceFileStream.Read(InputByteArray,
    0, InputByteArray.Length)

    myCryptoStream.Write(InputByteArray,
    0, InputByteArray.Length)

    Finally

    If myCryptoStream IsNot Nothing Then myCryptoStream.Close()
    If SourceFileStream IsNot Nothing Then SourceFileStream.Close()
    If ResultFileStream IsNot Nothing Then ResultFileStream.Close()
    If myAESProvider IsNot Nothing Then myAESProvider.Clear()

    End Try

    End Sub

    Private Sub DeCrypt(ByVal SourceFileName As String, ByVal ResultFileName As String, ByVal Key As String, ByVal IV As String) ‘对指定文件进行AES解密,并将明文保存到指定路径

    Dim myCryptoStream As CryptoStream = Nothing
    Dim SourceFileStream As FileStream = Nothing
    Dim ResultFileStream As FileStream = Nothing
    Dim myAESProvider As AesCryptoServiceProvider = Nothing

    Try

    myAESProvider
    = New AesCryptoServiceProvider

    myAESProvider.Key
    = ASCIIEncoding.ASCII.GetBytes(Key)
    myAESProvider.IV
    = ASCIIEncoding.ASCII.GetBytes(IV)

    Dim myICryptoTransform As ICryptoTransform = myAESProvider.CreateDecryptor(myAESProvider.Key, myAESProvider.IV)

    SourceFileStream
    = New FileStream(SourceFileName, FileMode.Open, FileAccess.Read, FileShare.None)

    ResultFileStream
    = New FileStream(ResultFileName, FileMode.Create, FileAccess.Write)

    myCryptoStream
    = New CryptoStream(ResultFileStream, myICryptoTransform, CryptoStreamMode.Write)

    Dim InputByteArray(SourceFileStream.Length - 1) As Byte

    SourceFileStream.Read(InputByteArray,
    0, InputByteArray.Length)

    myCryptoStream.Write(InputByteArray,
    0, InputByteArray.Length)

    Finally

    If myCryptoStream IsNot Nothing Then myCryptoStream.Close()
    If SourceFileStream IsNot Nothing Then SourceFileStream.Close()
    If ResultFileStream IsNot Nothing Then ResultFileStream.Close()
    If myAESProvider IsNot Nothing Then myAESProvider.Clear()

    End Try

    End Sub


    Public Sub AES_EnCrypt(ByVal SourceFileName As String, ByVal ResultFileName As String, ByVal Key As String, ByVal IV As String, ByVal IsEnCryption As Boolean) ‘主调用过程,用于控制AES加解密过程的调用顺序

    If IsEnCryption Then

    EnCrypt(SourceFileName, ResultFileName, Key, IV)

    Else

    DeCrypt(SourceFileName, ResultFileName, Key, IV)

    End If

    End Sub

    Private Function GetBitOfByte(ByVal b As Byte) As Byte() ’将一字节数分解为八个二进制位

    Dim res(7) As Byte

    For i As Integer = 0 To 7

    res(
    7 - i) = (b >> i) And 1

    Next

    Return res

    End Function

    Private Sub EnCryptWithBMP(ByVal SourceFileName As String, ByVal ResultBMPName As String, Optional ByVal IsInputBMPWithEnCrypt As Boolean = False, Optional ByVal strKey As String = "", Optional ByVal strIV As String = "") ‘次调用过程,控制图片水印加密过程的调用顺序

    If IsInputBMPWithEnCrypt Then

    Dim tempFileName As String = Path.GetTempFileName
    EnCrypt(SourceFileName, tempFileName, strKey, strIV)
    InputTextToBMP(tempFileName, ResultBMPName)
    File.Delete(tempFileName)

    Else

    InputTextToBMP(SourceFileName, ResultBMPName)

    End If

    End Sub

    Private Sub DeCryptWithBMP(ByVal SourceBMPName As String, ByVal ResultFileName As String, Optional ByVal IsInputBMPWithEnCrypt As Boolean = False, Optional ByVal strKey As String = "", Optional ByVal strIV As String = "") ’次调用过程,控制图片水印解密过程的调用顺序

    If IsInputBMPWithEnCrypt Then

    Dim tempFileName As String = Path.GetTempFileName
    GetTextFromBMP(SourceBMPName, tempFileName)

    DeCrypt(tempFileName, ResultFileName, strKey, strIV)
    File.Delete(tempFileName)

    Else

    GetTextFromBMP(SourceBMPName, ResultFileName)

    End If

    End Sub

    Public Sub AESwithBMP_EnCrypt(ByVal SourceFileName As String, ByVal ResultFileName As String, ByVal IsEnCryption As Boolean, Optional ByVal IsInputBMPWithEnCrypt As Boolean = False, Optional ByVal Key As String = "", Optional ByVal IV As String = "") ‘主调用过程,用于控制对图片水印的次调用过程的调用顺序

    If IsEnCryption Then

    If IsInputBMPWithEnCrypt Then

    EnCryptWithBMP(SourceFileName, ResultFileName,
    True, Key, IV)

    Else

    EnCryptWithBMP(SourceFileName, ResultFileName)

    End If

    Else

    If IsInputBMPWithEnCrypt Then

    DeCryptWithBMP(SourceFileName, ResultFileName,
    True, Key, IV)

    Else

    DeCryptWithBMP(SourceFileName, ResultFileName)

    End If

    End If

    End Sub

    Private Sub InputTextToBMP(ByVal SourceFileName As String, ByVal BMPName As String) ’将指定的文本信息进行二进制编码后,写入指定bmp图片

    Dim fStream As FileStream = Nothing
    Dim bmpStream As FileStream = Nothing

    Try

    fStream
    = New FileStream(SourceFileName, FileMode.Open, FileAccess.Read)
    bmpStream
    = New FileStream(BMPName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)

    Dim dm(1) As Byte
    bmpStream.Read(dm,
    0, 2)
    If Not (dm(0) = 66 AndAlso dm(1) = 77) Then ’bmp图片的前两字节是文件类型标示位

    Throw New ApplicationException("目标图片不是合法的BMP位图文件")

    End If

    Dim i As Integer
    Dim BMP_Data(7) As Byte
    Dim Text_Data(0) As Byte
    Dim Input_Data(7) As Byte

    bmpStream.Seek(
    55, SeekOrigin.Begin) ‘将bmp图片的指针跳到第55字节,因为55字节后才是数据区。
    For i = 0 To fStream.Length - 1

    fStream.Read(Text_Data,
    0, 1)

    bmpStream.Read(BMP_Data,
    0, 8)

    Dim temp_Data() As Byte = GetBitOfByte(Text_Data(0))

    For k As Integer = 0 To 7

    If temp_Data(k) = 0 Then

    Input_Data(k)
    = BMP_Data(k) And 254
    Else
    Input_Data(k)
    = BMP_Data(k) Or 1
    End If

    Next

    bmpStream.Seek(
    -8, SeekOrigin.Current)
    bmpStream.Write(Input_Data,
    0, 8)

    Next

    bmpStream.Read(BMP_Data,
    0, 8)

    For k As Integer = 0 To 7

    Input_Data(k)
    = BMP_Data(k) Or 1

    Next

    bmpStream.Seek(
    -8, SeekOrigin.Current)
    bmpStream.Write(Input_Data,
    0, 8)

    Finally

    If fStream IsNot Nothing Then fStream.Close()
    If bmpStream IsNot Nothing Then bmpStream.Close()

    End Try

    End Sub

    Private Sub GetTextFromBMP(ByVal SourceBMPName As String, ByVal ResultFileName As String) ‘将指定bmp图片中的二进制信息还原为文本

    Dim bmpStream As FileStream = Nothing
    Dim fStream As FileStream = Nothing

    Try

    bmpStream
    = New FileStream(SourceBMPName, FileMode.Open, FileAccess.Read, FileShare.None)
    fStream
    = New FileStream(ResultFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

    Dim dm(1) As Byte
    bmpStream.Read(dm,
    0, 2)
    If Not (dm(0) = 66 AndAlso dm(1) = 77) Then

    Throw New ApplicationException("目标图片不是合法的BMP位图文件")

    End If

    bmpStream.Seek(
    55, SeekOrigin.Begin)
    Do

    Dim BMP_Data(7) As Byte
    Dim Text_Data(0) As Byte

    bmpStream.Read(BMP_Data,
    0, 8)

    Dim temp_Data(7) As Byte

    For k As Integer = 0 To 7

    temp_Data(k)
    = BMP_Data(k) And 1

    Next

    Dim resByte As Byte = GetByteFromBit(temp_Data)
    If resByte = 255 Then

    Exit Do

    End If

    fStream.WriteByte(resByte)

    Loop

    Finally

    If fStream IsNot Nothing Then fStream.Close()
    If bmpStream IsNot Nothing Then bmpStream.Close()

    End Try

    End Sub

    Private Function GetByteFromBit(ByVal Bits() As Byte) As Byte ’根据八个二进制位算出对应的十进制数

    Dim res As Byte

    For i As Integer = 0 To 7

    res
    += Bits(7 - i) * 2 ^ i

    Next

    Return res

    End Function

    End Class

     

    转载于:https://www.cnblogs.com/AniX/archive/2010/10/16/1853020.html

    展开全文
  • 通过制图软件一张一张地添加水印技术上固然可行,但是工作量庞大,有时无法适应快速反应的要求,在实际操作中很少采用。在ASP.NET网站中,用户可以利用本小节的知识来实现自动添加水印。这里讲述两种水印:图像...

    在网络中发布资源时,比如图片,很多时候需要保护版权,即在图片上显示版权信息。要实现这样的效果,最简单有效的办法就是给图片添加水印(WaterMark),它和人民币中的水印原理一样,不容易涂改。通过制图软件一张一张地添加水印在技术上固然可行,但是工作量庞大,有时无法适应快速反应的要求,在实际操作中很少采用。在ASP.NET网站中,用户可以利用本小节的知识来实现自动添加水印。这里讲述两种水印:图像水印和文字水印。

    图像水印就是在要保护的图片中加入另一个作为水印的图片,即两个图片合二为一,基基本原理就是将一个图片绘制到另一个图片当中,形成一个图片。比如有个风景图片,为了表示版权信息,用户希望在图片的右下角添加说明。

    C#代码
    1.       string file = Server.MapPath("~/04.jpg");   
    2.        string mark = Server.MapPath("~/mark.jpg");   

    •        // 需要添加水印的图像   
    •        System.Drawing.Image img = System.Drawing.Image.FromFile(file);   
    •        // 水印图像   
    •        System.Drawing.Image imgMark = System.Drawing.Image.FromFile(mark);   
    •        // 创建Graphics对象   
    •        Graphics g = Graphics.FromImage(img);   
    •        // 将水印图像绘制到目标图像中去   
    •        g.DrawImage(imgMark, img.Width - imgMark.Width, img.Height - imgMark.Height);   
    •        // 原书示例代码中没有,没有这句则在非IE浏览器会出错   
    •        Response.ContentType = "image/JPEG";   
    •        //将图像加载到Response中   
    •        img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);   
    •        g.Dispose();   

    这里可以用DrawString方法来向图片绘制文本。为了使文字不至于影响图片效果,可以将其颜色设置为谈灰色,并适当调整透明度,参考代码如下:

    C#代码
    1.        string file = Server.MapPath("~/04.jpg");   
    2.         System.Drawing.Image img = System.Drawing.Image.FromFile(file);   
    3.         // 写文字的笔刷,透明度为100,蓝色   
    4.         Brush b = new SolidBrush(Color.FromArgb(100, Color.Blue));   
    5.         // 字体设置   
    6.         FontFamily ff = new FontFamily("华文琥珀");   
    7.         Font f = new Font(ff, 50, FontStyle.Bold);   
    8.         // 文字区域左上角坐标   
    9.         float x = 50;   
    10.         float y = 50;   
    11.         Graphics g = Graphics.FromImage(img);   
    12.         //设置Graphics对象   
    13.         g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;   
    14.         g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;   
    15.         g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;   
    16.         // 文字   
    17.         g.DrawString("流星剑制作", f, b, new PointF(x, y));   
    18.         // 原书示例代码中没有,没有这句则在非IE浏览器会出错   
    19.         Response.ContentType = "image/JPEG";   
    20.         //将图像加载到Response中   
    21.         img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);   
    22.         g.Dispose();  

    如果在添加文印过程中报“无法从带有索引像素格式的图像创建 Graphics 对象 ”

    c#代码:

            /// <summary>
            /// 写入图像水印
            /// </summary>
            /// <param name="str">水印字符串</param>
            /// <param name="filePath">原图片文件名(含路径)</param>
            /// <param name="savePath">水印加入后图片文件名(含路径)</param>
            /// <param name="_iHeight">水印文字区域高度</param>
            /// <param name="_iWidth">水印文字区域宽度</param>
            /// <returns></returns>
            ///  
            public string CreateBackImage(string str, string filePath, string savePath, int _iHeight, int _iWidth)
            {
                System.Drawing.Image img = System.Drawing.Image.FromFile(filePath);
                Bitmap bmp = new Bitmap(img.Width, img.Height);
                Graphics g = Graphics.FromImage(bmp);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.DrawImage(img, 0, 0, img.Width, img.Height);
                Font font = new Font("宋体", 16);
                Color mycolor = ColorTranslator.FromHtml("#9BB032");
                Brush brush = new SolidBrush(mycolor);
                g.DrawString(str, font, brush,img.Width - _iHeight, img.Height - _iWidth);
                g.Dispose();
                bmp.Save(savePath);
                return savePath;
            }

    展开全文
  • 根据数字水印技术作用域的不同,数字水印技术可以分为空间域水印技术和变换域水印技术。空间域技术都是使用各种方法直接改变图像的像素,直接将水印信息加载在数据上,属于早期的数字水印研究,典型的几种空域水印...

    空间域LSB的数字水印

    根据数字水印技术作用域的不同,数字水印技术可以分为空间域水印技术和变换域水印技术。空间域技术都是使用各种方法直接改变图像的像素,直接将水印信息加载在数据上,属于早期的数字水印研究,典型的几种空域水印算法包括:最低有效位方法(LSB)、Patchwork方法、文档结构微调方法等。我们今天来详细介绍一下作为空间域水印的基础LSB方法的数字水印。

    LSB方法的原理

    在敲代码之前,我们先解释一下LSB方法的原理,了解了原理会更好的理解每一步代码。LSB全称为Least Significant Bit,解释为“最低有效位”,什么是最低有效位?我们知道,像素是数字图像的基本元素,图像是由像素构成的,而每个像素又是由多比特的方式构成的,在灰度图像中,每个像素通常为8位,在RGB图像中,每个像素为24比特(R,G,B三色各8位)每一位的取值为0或1。

    对于8位的灰度图像,我们可以把图像分为8个位平面,从LSB(最低有效位0)到MSB(最高有效位7)。从位平面的分布来看,随着位平面从低位到高位(即从位平面0到位平面7),位平面图像的特征逐渐变得复杂,细节不断增加,比较低的位平面包含的图像信息很少,所以,改变低位对图像的质量影响不大。LSB方法就是利用了这一点,在图像的低位隐藏水印信息。

    从原理上我们就能看出这种方法简单,计算量小,隐藏量大,但很明显,鲁棒性很差,攻击者只需通过简单的操作删除图像低位数据或者对数字图像进行某种简单数学变换就可将水印信息滤除或破坏掉,因此以LSB方法为原型,产生了很多变形的LSB方法。

    LSB数字水印源代码(matlab)

    嵌入部分:

    %将水印图像按最不重要位(LSB)方法嵌入到载体图像中,并计算PSNR
    clc
    clear all;
    close all;
    
    % 读入载体图像
    file_name='lena.bmp';
    cover_object=imread(file_name);
    cover_object=rgb2gray(cover_object);
    figure(1);subplot(1,2,1);
    imshow(cover_object,[]);
    title('原始图像');
    % 读入水印图像
    file_name='64.bmp';
    message=imread(file_name);
    message=double(message);
    message=round(message/256);
    message=uint8(message);
    % 确定载体图像的大小
    Mc=size(cover_object,1);
    Nc=size(cover_object,2);
    % 确定水印图像的大小
    Mm=size(message,1);
    Nm=size(message,2);
    % 将水印扩展为原图像大小,并写入watermark
    for ii = 1:Mc
        for jj = 1:Nc
            watermark(ii,jj)=message(mod(ii, Mm)+1,mod(jj, Nm)+1);
        end
    end
    % 将原图的最低有效位值换为水印的值
    watermarked_image=cover_object;
    for ii = 1:Mc
       for jj = 1:Nc
           watermarked_image(ii, jj)=bitset(watermarked_image(ii, jj), 1, watermark(ii ,jj));
       end 
    end
    imwrite(watermarked_image,'lsb_watermarked.bmp','bmp');
    
    % 显示已嵌入水印的图像 
    figure(1);subplot(1,2,2);
    imshow(watermarked_image,[]);
    title('嵌入水印后图像');
    
    % 计算已嵌入水印图像的PSNR
    psnr=PSNR(cover_object, watermarked_image),
    

    提取部分:

    %将水印从载体图像中提取出来,并计算误比特率
    
    clc
    clear all;
    close all;
    
    %水印图像提取
    file_name='lsb_watermarked.bmp';
    watermarked_image=imread(file_name);
    Mw =size(watermarked_image,1);
    Nw =size(watermarked_image,2);
    
    %读入原始水印
    file_name='64.bmp';
    orig_watermark=imread(file_name);
    figure(1);subplot(1,2,1);
    imshow(orig_watermark,[]);
    title('原水印图');
    
    message_pad=double(orig_watermark);
    message_pad=round(message_pad./256);
    message_pad=uint8(message_pad);
    
    
    %%原始水印的行数与列数
    Mm=size(orig_watermark,1);	        %水印的行数
    Nm=size(orig_watermark,2);	        %水印的列数
    
    % 用嵌入水印图像的最低有效位重建水印
    for ii = 1:Mw
       for jj = 1:Nw
           watermark(ii, jj)=bitget(watermarked_image(ii, jj),1);
       end
    end
    watermark=256*double(watermark);
    
    %将提取水印变为原始水印大小
    for ii = 1:Mm-1
        for jj = 1:Nm-1
            watermark1(ii+1,jj+1)=watermark(ii,jj);
        end
    end
    watermark1(1,1)=watermark(Mm,Nm);
    %显示提取的水印图像
    figure(1);subplot(1,2,2);
    imshow(watermark1,[]);
    title('提取出的水印图');
    
    message_pad_recover=double(watermark1);
    message_pad_recover=round(message_pad_recover./256);
    message_pad_recover=uint8(message_pad_recover);
    message_pad_recover=reshape(message_pad_recover,[1,64*64]);
    
    % 显示提取错误比特的比例
    
    len=length(message_pad);
    bit_error_rate=sum(abs(message_pad_recover(1:len)-message_pad(1:len)))/len,
    

    附上代码运行效果:
    在这里插入图片描述
    在这里插入图片描述
    本人还在学习阶段,若有错误欢迎大家指正

    展开全文
  • 编译环境为vs2010,使用空域隐藏技术对数字水印进行加密,使用彩色水印,将水印像素值前四位加到底层图像置零的后四位,得到经过加密的图像。 是LSB水印加密算法的一种改进,使用了彩色水印
  • 在全球图像传感器市场,索尼技术优势明显,长期垄断高端市场。不过自 2016 三星推出 ISOCELL 品牌图像传感器以来,三星进步神速,不断缩小与索尼的差距。三星公司曾在 2018 年表示:希望取代索尼,成为市场上排名第...
  • MPEG-4 的视频水印算法 孙明瑞 * 哈尔滨理工大学计算机科学和技术学院哈尔滨 150080 5 摘要本文提出一种新的抵抗共谋攻击 MPEG-4 压缩攻击和帧下降攻击的视频水 印算法 此算法基于视频拼接技术 将其使用在视频水印中...
  • 数字水印(文字嵌入)

    千次阅读 2018-08-31 22:45:16
    ​ 学习python之余发现有这么一个数字水印技术,觉得挺好玩的于是便实现出来。 ​ 文章中的思路已经说明的很是清楚了,主要思路是我们知道图像是由一个一个的像素点构成的,而每个像素点是由rgb三原色组成,也...
  • 作为版权保护的重要手段,数字水印技术已得到了广泛的研究和应用,但实用的彩色图像数字水印技术不多,特别是灰度级水印信号的嵌入算法不多。文中充分考虑到人类视觉系统特点,采用YIQ色彩空间,将灰度图像水印信号...
  • 算法基于对原始图像2×2大小分块,计算图像块各像素高6 bit的灰度均值作为水印,利用混沌和置乱技术水印信息进行加密和确定水印比特嵌入的位置。实验结果表明,该算法简单、安全性高,窜改精确定位到2×2图像块,...
  • 针对以往的渐进式可视密码多是以像素扩展为基础且分享图像是杂乱无章的问题,提出使用分享矩阵来产生不扩展的分享图像,并利用数字水印技术产生有意义的分享图像。与现有方案相比,该方案具有良好的对比度与安全性,...
  • 二值水印嵌入位置通过广义猫映射随机产生,训练一个神经网络记忆每个图像块中像素之间的关系,并采用水印嵌入增强处理技术,加强了水印的嵌入强度。实验结果表明,该算法具有较强的鲁棒性,能有效地抵抗剪切攻击、...
  • 数字水印技术作为版权保护的重要手段而得到了广泛的研究和应用。  现有图像数字水印算法基本上可分为两类:空间域方法和变换域方法。空域法通过直接改变图像某些像素的灰度值来嵌入水印,如LSB、扩展频谱等;而变换...
  • Alpha-Blending 水印

    2010-07-19 20:14:53
    所谓AlphaBlend技术,其实就是按照"Alpha"混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。在计算机中的图象可以用 R(红色),G(绿色),B(蓝色)三原色来表示。假设一幅图象是A,另一幅透明的图象是B,...
  • 提出了一种基于纹理灰度变化统计的图像检索方法,在水平、垂直、45°和135°方向上统计像素灰度值的变化量,提取关于图像纹理粗细、走向等信息。并将此方法与灰度共生矩阵法和纹理谱法进行比较,从查准率、平均序号...
  • LSB图像信息隐藏

    万次阅读 2014-02-06 22:15:55
    替换技术就是利用人的感观系统对特定的随机noise不敏感原理,通过使用秘密信息比特替换随机noise,从而实现信息隐藏。图像高位平面对图像感官质量起主要作用,去除图像最低几个位平面并不会造成画面质量的明显下降。...
  • 全书分6篇共25章,主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows...
  • 图像水印技术是保护数字图像版权的一种替代方案,本文提出了一种新的嵌入技术,该技术基于不同的嵌入强度将图像分割成8×8像素的非重叠块。为每个图像块计算方差像素值。对嵌入区域选择方差最大的图像块,采用离散...
  • LSB是空域数字水印的一项技术,顾名思义就是在图片的每个像素的最低位上嵌入水印信息。 介绍原理的博客资料网上很多,说点不一样的。 一开始学习的时候在网上看了一个讲解的python实现 此文中的大致意思是将水印图片...
  • PAGE 信息隐藏技术 实验报告 实验2DCT信息隐藏实验 杭州...水印嵌入算法 应用DCT算法实现水印嵌入 读入原始图像和水印水印图像二值化将原图分成若干个8X8的矩阵分别做DCT变换然后将(3,3)位置的像素点根据水印上相同
  • 可逆信息隐藏项目.zip

    2019-08-29 15:37:56
    通过预测误差扩展技术将秘密水印嵌入到原始图像中。 方案(2).采用了1*3子块像素分组的模式,对每个子块,按升序排列三个像素计算预测误差,预测误差用于预测子块是否可以嵌入秘密信息。其次,利用像素误差扩展技术,...
  • 然后,利用数字水印技术在缩小图像的每个像素中嵌入该像素最佳放大方法的编码;最后,对水印图像利用JPEG-LS无损压缩得到最终的压缩图像,并进行存储和传输。对磁共振(MR)图像和计算机断层(CT)图像两种医学图像...
  • 图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列,从而去除图像中受污染的区域。图像修复不仅可以去除图像中得“划痕”,还可以去除图像中得...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

像素水印技术