向图片中添加磁力链接与提取

来源:互联网 发布:观澜网络给打电话 编辑:程序博客网 时间:2024/04/30 11:17

  转载请注明地址,谢谢!


  前言:空调欠费停电了,大晚上躺床上实在热的睡不着,那干啥呢,起床下来看书吧...看了一会儿不想看了,好久没写东西了,想写个东西玩玩,最近正好在做图像方面的东西,一直在用Matlab,不过matlab实在是太慢了。然后从网上找了找opencv的教程看了下用C++写了份小工具玩。


下载链接在这:http://pan.baidu.com/s/1gdjf1cf 这个是编译好的。。。我在笔记本上(有opencv)和台式机上(没opencv)上都能运行,但是没能测试脱离VS能不能运行...


/*

思路很简单了,信息隐藏中的经典算法LSB隐藏,一切从简用的是顺序LSB,想再高(zhuang)端(b)点可以写个随机LSB。LSB的意思就是最不重要位,一般图像是用一个字节即8位存储的,高位保留了图像中的绝大部分信息,低位人眼对其不是很敏感,所以可以通过去除图像中的低4位,向其中写入数据来达到隐藏的目的。要注意写入的话要把需要隐藏的信息的长度也要写进去,不然提取的时候不知道该提取多长的数据。

*/


一定是熬夜敲代码脑子秀逗了。。。这里我用的是直接4bit替换法,用信息替换图像低4位,LSB算法是将信息隐藏在最低位.......Orz


环境:vs2013+opencv2.4.8


代码如下

#include <iostream>#include <fstream>#include <string>#include <opencv2\opencv.hpp>using namespace std;using namespace cv;//磁力链接隐藏//参数说明://inImage 待隐藏的载体图像//txt 存放磁力链接的文本文档//outImage 隐藏后的隐蔽图像void MagnetHide(string inImage, string txt, string outImage);//链接嵌入到图像中//参数说明://image 嵌入图像//magnet 磁力链接void embe2image(Mat &image, string magnet);int main(){MagnetHide("1.jpg", "2.txt", "3.bmp");return 0;}void MagnetHide(string inImage, string txt, string outImage){Mat im = imread(inImage); //读取载体图像//读取磁力链接文本ifstream f;f.open(txt);string magnet;while (!f.eof()){getline(f, magnet); //读取每个磁力链接,暂时只支持每幅图像隐藏一个磁力链接embe2image(im, magnet); //嵌入到图像中}imwrite(outImage, im);}void embe2image(Mat &image, string magnet){//将长度表示为二进制int len = magnet.length();int lenbi[8];for (int i = 0; i < 8; ++i)lenbi[7 - i] = (len >> i) & 1;//将字符串表示为二进制int *bi = new int[len * 8];for (int i = 0, num = 0; i < len; ++i)for (int j = 0; j < 8; ++j)bi[num ++] = (magnet[i] >> (7-j)) & 1;//去除图像低4位,嵌入信息for (int i = 0, num = 0; i < image.rows; ++i){uchar *p = image.ptr<uchar>(i);for (int j = 0; j < image.cols; ++j){p[j] &= 240;if (i == 0 && j == 0) //前两个像素用来隐藏磁力链接长度{for (int k = 0; k < 4; ++k)p[j] |= (lenbi[k] << (3 - k));continue;}else if (i == 0 && j == 1){for (int k = 0; k < 4; ++k)p[j] |= (lenbi[k + 4] << (3 - k));continue;}else //后续信息嵌入{for (int k = 0; k < 4; ++k)p[j] |= (bi[num++ ] << (3 - k));if (num == len * 8) //所有信息嵌入完毕break; }}if (num == len * 8)break;}delete[] bi;}

#include <iostream>#include <fstream>#include <opencv2\opencv.hpp>#include <string>using namespace std;using namespace cv;//提取图像中的磁力链接//参数说明://image 载体图像//magnet 磁力链接保存地址void MagnetExtract(string image, string magnet);int main(){MagnetExtract("1.bmp", "2.txt");return 0;}void MagnetExtract(string image, string magnet){Mat im = imread(image); //读取图像//提取磁力链接长度int lenbi[8]; uchar *p = im.ptr<uchar>(0);for (int i = 0; i < 4; ++i)lenbi[i] = (p[0] >> (3 - i)) & 1;for (int i = 0; i < 4; ++i)lenbi[i + 4] = (p[1] >> (3 - i)) & 1;int len = 0;for (int i = 0; i < 8; ++i)len |= (lenbi[i] << (7-i));//提取磁力链接二进制int *bi = new int[len * 8];for (int i = 0, num = 0; i < im.rows; ++i){p = im.ptr<uchar>(i);int j;if (i == 0)j = 2;elsej = 0;for (; j < im.cols; ++j){for (int k = 0; k < 4; ++k)bi[num++] = (p[j] >> (3 - k)) & 1;if (num == len * 8)break;}if (num == len * 8)break;}//磁力链接二进制转换为字符uchar *ans = new uchar[len + 1];for (int i = 0; i < len; ++i)ans[i] = 0;for (int i = 0, num = 0; i < len; ++i)for (int j = 0; j < 8; ++j)ans[i] |= (bi[num++] << (7 - j));ans[len] = 0;//磁力链接写入文件ofstream f;f.open(magnet);f << ans;delete[] ans;}



0 0
原创粉丝点击