关于BMP图像的结构网上资料很多,这里不再骜述。

算法是将一个文件以二进制打开,将每一位存放到图片数据区的像素的每个字节的最低位。
以达到信息隐藏的目的。

  1//---------------------------------------------
  2//  基于LSB的信息隐藏
  3//---------------------------------------------
  4int  FTDib::LSBCoder(const char* textFileName)
  5{
  6    ifstream textFile;
  7    textFile.open(textFileName,ios::in | ios::binary);
  8    textFile.seekg(0,textFile.end);
  9    DWORD textFileLength = textFile.tellg();
 10    //判断位图是否够存储隐藏的信息
 11    DWORD colorTableSize = m_numberOfColors * sizeof(RGB_Element);
 12    if((size - colorTableSize)<textFileLength*8)
 13    {
 14        return -1//不够隐藏
 15    }

 16
 17
 18    BYTE* pTextFile = new BYTE[textFileLength+1];
 19    cout<<"隐藏时文件长度:"<<textFileLength<<endl;
 20    textFile.seekg(0,textFile.beg);
 21    textFile.read((char*)pTextFile,textFileLength);
 22    textFile.close();
 23
 24    BYTE textData;
 25    for(int i=0,k=0; i< textFileLength; ++i)
 26    {
 27        for(int j=0; j<8++j)
 28        {
 29            textData = pTextFile[i]>>j;
 30            textData = textData&0x01;
 31            if(textData==0)
 32            {
 33                pDib[k+32= pDib[k+32]&0xfe;
 34            }

 35            else
 36            {
 37                pDib[k+32= pDib[k+32]|0x01;
 38            }

 39            ++k;
 40        }

 41    }

 42    cout<<"信息隐藏完毕"<<endl;
 43    //在前四个字节中写入text文件数据长度
 44    DWORD length;
 45    for(int i=0; i<32++i)
 46    {
 47        length = textFileLength>>i;
 48        length = length&0x00000001;
 49        if(length==0)
 50        {
 51            pDib[i] = pDib[i]&0x1e;
 52        }

 53        else
 54        {
 55            pDib[i] = pDib[i]|0x01;
 56        }

 57    }

 58
 59    return 0;
 60
 61    
 62}

 63
 64//---------------------------------------------
 65//  解码基于LSB的信息隐藏
 66//---------------------------------------------
 67void  FTDib::LSBDecoder(const char* textFileName)
 68{
 69    DWORD length = 0x00000000;
 70    BYTE bit;
 71    //获取txt文件长度
 72    for(int i=0; i<32++i)
 73    {
 74        bit = pDib[i]&0x01;
 75        if(bit==0)
 76        {
 77            length = length&0x7fffffff;
 78        }

 79        else
 80        {
 81            length = length|0x80000000;
 82        }

 83        if (i<31)    length = length>>1;
 84    }

 85
 86    cout<<"解码时文件长度:"<<length<<endl;
 87    //开始解码
 88    BYTE* pTextFile = new BYTE[length];
 89    BYTE textData;
 90    for(int i=0,k=0; i<length*8++i)
 91    {
 92        if(i && i%8==0){++k;}
 93        textData = pDib[i+32]&0x01;
 94        if(textData==0)
 95        {
 96            pTextFile[k] = pTextFile[k]&0x7f;
 97        }

 98        else
 99        {
100            pTextFile[k] = pTextFile[k]|0x80;
101        }

102        if (i%8 != 7) pTextFile[k] = pTextFile[k]>>1;
103    }

104
105    cout<<"解码完毕"<<endl;
106
107    ofstream textFile;
108    textFile.open(textFileName,ios::out | ios::binary);
109    textFile.write((char*)pTextFile,length);
110    textFile.close();
111    delete pTextFile;
112}

113

BMP结构及源码:FTDib.zip