基于24位bmp图片数据区隐写的实现

1,关于数据区隐写

数据区隐写,即将数据写入到数据区中。相比文件外壳隐写和保留区隐写,更为隐蔽,隐藏的信息容量相对较大。在数据区隐写会造成图像变化,所以需要控制写入方式,以及改写量。使得在普通肉眼难以辨别的更改中实现数据的隐藏。至于其他的隐写方法请看:简单信息隐藏技术的实现与讨论

2,24位bmp图像简介

要在bmp图像进行数据区隐写,必须要知道它的数据结构。否则,可能会破坏图像。 这是bmp的文件结构。

  1.     位图文件头(bitmap-file header)包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段。(14字节)
  2.     位图信息头(bitmap-information header)(40字节)
  3.     彩色表/调色板(color table)[24位bmp图没有调色板]
  4.     位图数据(bitmap-data)

24位bmp图像数据存储的是实际的颜色数据,每个像素用3字节表示,分别是红绿蓝。文件头和信息头共占了54个字节。 

3.程序设计思路

将bmp和txt读入之后,其实就是两个字符串。接下来要做的就是设计一个算法让它们合并。 考虑到如果直接替换数据区字符。会使像素点有巨大改变。所以,每个字符我只改末尾的一个bit,这样一来,像素点的变化会非常小,几乎没有区别。而且,我尽可能让更改的bit分散在数据区。为了方便提取,我在保留区记录了两个值,他们的异或值就是数据区隐藏信息字节的间隔值。

4.代码

01 //hid.cpp  by kryptosx
02 //隐藏程序代码
03 #include <iostream>
04 #include <fstream>
05 #include <bitset>
06 #include<cstdlib>
07 #include "stdio.h"
08 using namespace std;
09 string pstr;
10 string tstr;
11 string stemp;
12 const int py=54;             //数据区开始位置(因为从0算起)
13 int main(int argc, char* argv[])
14 {
15     if(argc!=3)
16     {
17         puts("error:参数错误");
18         return 0;
19     }
20     ifstream pic(argv[1]);
21     ifstream txt(argv[2]);
22     if(!pic.is_open() || !txt.is_open())
23     {
24         perror("文件打开失败");
25         return 0;
26     }
27     while(getline(pic,stemp))
28     {
29         pstr+=stemp;
30         stemp.clear();
31     }
32     while(getline(txt,stemp))
33     {
34         tstr+=stemp;
35         stemp.clear();
36     }
37     int pl=pstr.size();
38     int tl=tstr.size();    
39      
40     if(tl>100)
41     {
42         puts("字符过多");
43         printf("%d",tl);
44         return 0;
45     }
46     if(tl==0)
47     {
48         puts("没有字符");
49         return 0; 
50     }
51     int ty=(pl-py)/(tl*8);        //计算间隔
52     int tp=rand()%256;
53     pstr[6]=tl^tp;
54     pstr[7]=tp;            //记录隐藏信息的长度到保留区中
55     for(int i=py,j=0;j!=tl;++j)          //把隐藏的信息转化成bit,写入到间隔的字节的最后一位。
56     {
57          bitset<8> bt(tstr[j]);
58          for(int k=0;k!=8;k++)
59          {
60              if(bt[8-k-1]==true) pstr[i]|=1;      
61              else pstr[i]&=~1;           
62              i+=ty;
63          }
64     }
65     ofstream out("out.bmp");
66     out<<pstr<<endl;
67     pic.close();          //关闭文件流
68     txt.close();
69     out.close();
70     return 0;
71 }

 

01 //creck.cpp by kryptosx
02 //数据提取代码
03 #include <iostream>
04 #include <fstream>
05 #include <bitset>
06 #include<cstdlib>
07 #include "stdio.h"
08 using namespace std;
09 string pstr;
10 string stemp;
11 const int py=54;
12 int main(int argc, char* argv[])
13 {
14     if(argc!=2)
15     {
16         puts("error:参数错误");
17         return 0;
18     }
19     ifstream pic(argv[1]);
20     if(!pic.is_open())
21     {
22         perror("文件打开失败");
23         return 0;
24     }   
25     while(getline(pic,stemp))
26     {
27         pstr+=stemp;
28     }
29  
30     int pl=pstr.size(); 
31     int tl=pstr[6]^pstr[7];         //从保留区提取出隐藏信息的长度 
32     int ty=(pl-py)/(tl*8);       //计算间隔 
33      
34     char temp=0;
35     ofstream out("out.txt");
36     for(int i=py,j=0;j!=tl;++j)   //提取每个隐写字节末尾的bit,然后重组成隐藏信息。 
37     {
38          temp=0;
39          for(int k=0;k!=8;k++)
40          {
41              temp<<=1;
42              temp+=bitset<8>(pstr[i])[0];
43              i+=ty;
44          }
45          out<<temp;
46     }
47     pic.close();
48     out.close();
49     return 0;
50 }

 5.总结

这是一个很简单的图片数据区隐写程序,基于24位bmp图像。基本实现了需要的功能,分散的写入使得肉眼难以发现异常,其次,无需原图也可以提取信息。

转载请注明:旅途@KryptosX » 基于24位bmp图片数据区隐写的实现

时间: 2024-08-31 19:21:21

基于24位bmp图片数据区隐写的实现的相关文章

mfc- MFC读取24位bmp图像出问题了,求大神来解决

问题描述 MFC读取24位bmp图像出问题了,求大神来解决 我要实现的是将24位bmp文件读入并在用户区显示,但是显示结果都不对的,谁能来帮忙看下? 注:因为对bmp文件还要做后续的处理(比如RGB转CMYK这样的),所以我现在写的代码只是一个测试是否正确读取bmp的程序.用其它控件去读取图片对我来说是毫无用处的. 这是我的代码: void CMy3View::OnLoad() { // TODO: 在此添加命令处理程序代码 CString strFilter,strFilename,info;

Android系统移植与调试之-------&amp;gt;如何使用PhotoShop转换24位的bmp图片为16位bmp图片

使用Android移植时候,很多图片都需要16为的bmp格式,所以研究了一下如何从24位转换成16位,供大家参阅 step1:查看bmp图片的属性,如下图所示,是24位的 step2:用PhotoShop打开此图片,然后点击文件-->存储为 step3:在弹出的选项框中选择bmp格式,然后点击保存 step4:会弹出选项让您选择存储为多少位的bmp,选择24位 step5:还可以选择高级模式,进行高级设置 step6:设置完后打开另存为的图片查看属性,以及将24位改为16位的图片了 ======

颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)【转】

转自:http://www.cnblogs.com/1175429393wljblog/p/5404626.html 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出来的颜色的数量有8位数.16.24都是一样的.24位的颜色数量已经很多了,叫做"真彩色",其实32位和24位颜色数量是一样多的.32位多出来的8位数是用来表示透明度信息的,

C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。

原文:C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> /// <param name="original"> 源图像. </param> /// <returns> 8位灰度图像. </returns> public static Bitmap RgbToGrayScale(Bitmap o

求教:位深度24的bmp转成位深度4的bmp

问题描述 开发环境是C#,求教方法:自定义图片内容,生成一个位深度为4的bmp彩色图片我现在只能生成了非4位的,尝试不少方法也不能转成4位的.着急求教! 解决方案 解决方案二:24位的rgb是888请问4位的是怎么分配的?解决方案三:引用1楼shingoscar的回复: 24位的rgb是888请问4位的是怎么分配的? 灰度图解决方案四:16色的就是4位的http://blog.csdn.net/heavensdoor/article/details/8486248解决方案五:Bitmapbmp=

利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片

1.读取图片数据 函数原型:bool LoadImage(const char *pName, unsigned char *pBitData); 函数功能,读取pName指向的图片文件的位图数据 bool LoadImage(const char *pName, unsigned char *pBitData) {     HDC     hdcTemp; // DC用来保存位图     HBITMAP     hbmpTemp; // 保存临时位图     IPicture    *pPic

Delphi实现24位真彩色图标

引言 Delphi是目前广泛使用的可视化开发工具,它自身带有一个图片.图标的编辑器--Image Editor,但是到Delphi7为止,都不能进行真彩图标的编辑,可以说是一个遗憾.笔者通过对图标文件的研究,实现了产生24位真彩色图标. 图标文件的格式 首先,分析一个具体的图标 .在CS1.6中有一个图标game.ico( ),如果用WinHex等可以进行16进制编辑的软件打开这个图标文件,我们可以看到如下数据: 00 00 01 00 04 00 10 10 00 00 00 00 00 00

c语言-C语言提取BMP图片遇到的问题

问题描述 C语言提取BMP图片遇到的问题 有几个问题想请教一下大家. 1:比如100 * 100像素的图片,它对角线应该有200个像素,还是141个像素? 2:100 * 100像素的BMP提取出来的像素点 有30000个还是40000个?我用以下代码提取的是40000个,分别是R,G,B和那个保留吗?还是其他什么? 3:我想实现的是:8位BMP的对角线像素点提取到文本文档,做着做着有点蒙圈了 #include #include #pragma pack(2) /*定义WORD为两个字节的类型*

图像编程学习笔记4——24位真彩色转换为灰度图像

以下文本内容来自http://zhidao.baidu.com/question/152910968.html中的部分内容 把RGB值转换为灰度值的公式:Gray   :=   Trunc(0.3   *   Red   +   0.59   *   Green   +   0.11   *   Blue);//这句用的是浮点运算在图像处理中,速度就是生命,能不用浮点运算,就最好不要用!Gray   :=   (30   *   Red   +   59   *   Green   +   11