点击菜单栏“粉丝福利”
拿小度,兑手机!
1.一份残缺的 hide.go 代码,其中有四个主要的功能函数需要填写
2.测试用图像(BMP格式)与测试用文本 https://pan.baidu.com/s/102Xx4Gjgejr5I64PM37w_A 声明:该程序的 _4byte2int 、GetPartsOfBmp 、HideInfo 、ShowInfo 是由本人编写的,其中 HideInfo 、ShowInfo 实现主要功能,其他部分由学校老师提供。
图像在隐藏文本信息之后文件大小不变,肉眼基本无法分辨隐藏前后的图像。
隐藏效率为1:4,即1byte的信息需要4byte的图像来隐藏。
即 含隐藏信息的图像路径 、还原的文本信息路径 该函数完成的是信息还原功能 _print_usage()函数 该函数用于 用户参数输入不足时的报错信息 HideProcedure函数 该函数完成信息隐藏功能
0001 0010 <<2 0100 1000 直接相加可以得到新像素 文本信息隐藏类似 该语句是为了取出 hide_data[i-4] (1byte ,8bit)中的 5-6 位 ProduceImg函数 重新合成图像并输出 ShowProcedure函数 与HideProcedure函数大致类似 一个区别是该函数不再需要file_header, bmpinfo_header部分,只保存了pixel_array ShowInfo函数 WriteAllToFile函数 将还原出的文本写入文件
作者:谢瑞兆 来源:知乎人工智能学习圈
该项目源自某大学go语言作业
注:本文使用 go 1.8.3 下面的这个 Project.zip 包含1.一份残缺的 hide.go 代码,其中有四个主要的功能函数需要填写
2.测试用图像(BMP格式)与测试用文本 https://pan.baidu.com/s/102Xx4Gjgejr5I64PM37w_A 声明:该程序的 _4byte2int 、GetPartsOfBmp 、HideInfo 、ShowInfo 是由本人编写的,其中 HideInfo 、ShowInfo 实现主要功能,其他部分由学校老师提供。
该程序的主要功能是将一段文本信息存储入一个图像,并能够完整地还原出原图像。
图像在隐藏文本信息之后文件大小不变,肉眼基本无法分辨隐藏前后的图像。
隐藏效率为1:4,即1byte的信息需要4byte的图像来隐藏。
1
实现原理
以 BMP 格式存储的图像是由一个个像素构成的,而每一个像素块又存储着RGB三种颜色。 单独的一个像素的一个颜色(如R)的大小是 8 位(0-255),即 1 byte。而如果我们对这 1 byte 的颜色进行微调,例如调整该色的最后 2 位,对于颜色的影响是极小的,而人眼基本无法分辨这种微小的颜色变化,例图如下: 所以,将一个字符(1 byte,8 bit)以 2bit 为一个单位,拆分为 4 份,反向存储(为了便于读取)于 4 个 RGB块 的最后 2bit ,即可完成隐藏。 一个需要注意的事实是,如果仅仅是简单地将文本信息以 1:4 的比例存入图像信息,在还原信息是会遭遇困难——程序不知道何时停止。因此,我们需要一个标识。在这个程序中,我使用的方法是在像素阵列开头存储一个固定长度的量(Interger,4 byte)——文本信息长度,在读取出该数值之后,程序就可以在隐藏信息结束的位置停下,并生成隐藏文本文件。 需要注意,存储时应以小端存储,便于还原 BMP文件分为三个部分:file_header 、bmpinfo_header 、pixel_array。其中,第三部分即 pixel_array (像素阵列) 是信息隐藏的目标阵列。file_header 的长度是 14 byte ,bmpinfo_header 的长度是 40 byte。同时,bmpinfo_header 中存储着图像的 宽(width)高(height)信息,这些信息有可能有助于程序的构建。2
程序实现
main函数 命令行参量 os.Args 用于获取用户输入的参数,需要注意的是 os.Args[0] 为文件路径。 在 main 函数中,依照用户输入的参数 hide 或者 show 分别执行 HideProcedure 或者ShowProcedure。 HideProcedure 需要传入的三个参数分别是src_img_path , hide_file_path , dest_img_path 即 源图像路径 、待隐藏文本路径 、隐藏完成的图像输出路径。 该函数完成的是信息隐藏功能 ShowProcedure 需要传入的三个参数分别是 src_img_path , data_path即 含隐藏信息的图像路径 、还原的文本信息路径 该函数完成的是信息还原功能 _print_usage()函数 该函数用于 用户参数输入不足时的报错信息 HideProcedure函数 该函数完成信息隐藏功能
第一行打印提示信息
第二行调用 GetPartsOfBmp 函数 将bmp图像切分为三个部分
file_header, bmpinfo_header, pixel_array
第三行调用 ReadAllFromFile 将 待隐藏的文本信息 读入 hide_data中
第四行调用 HideInfo 函数 将文本信息拆分隐藏入像素阵列中
第五行调用 ProduceImg 将 file_header , bmpinfo_header 和 新的像素阵列new_pixel_array 重新整合为 bmp 文件并输出到 dest_img_path
GetPartsOfBmp函数 调用 ReadAllFromFile 函数 将 源图像信息 存入 alldata 依据bmp三个部分的大小,依次分为[0:14] [14:54] [54:] 最后一部分即是我们需要的像素阵列 需要注意的是,bmp文件可能包含一些在像素阵列之后的部分,即[54:]中可能包含非像素的部分,因此使用 [54:54+width * height * 3] 更加稳妥 ReadAllFromFile函数 简单的文件读取函数 _4byte2int函数 将小端模式存储的4个byte还原为int HideInfo函数 该语句将 一个像素的单个色块 右移2位,再左移两位,结果是清零了最低两位 0100 1011 >>2 0001 00100001 0010 <<2 0100 1000 直接相加可以得到新像素 文本信息隐藏类似 该语句是为了取出 hide_data[i-4] (1byte ,8bit)中的 5-6 位 ProduceImg函数 重新合成图像并输出 ShowProcedure函数 与HideProcedure函数大致类似 一个区别是该函数不再需要file_header, bmpinfo_header部分,只保存了pixel_array ShowInfo函数 WriteAllToFile函数 将还原出的文本写入文件
3
运行示例
可以看到还原出的文本与原文件大小相同,经检验内容也相同 两个图像用人眼难以辨别 基本达成目标 附完整代码原文链接: https://zhuanlan.zhihu.com/p/141339765