關于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