向图片中添加磁力链接与提取
来源:互联网 发布:观澜网络给打电话 编辑:程序博客网 时间: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
- 向图片中添加磁力链接与提取
- 磁力链接
- 磁力链接
- 向面板中添加图片
- 向AD中添加图片
- 向EditText中添加图片
- 向JPanel中添加图片
- 磁力链接的BASE32编码向HEX编码的转换
- 向数据库中添加图片,显示图片
- 磁力链接+爬虫
- JQuery 磁力图片
- VC中直接向水晶报表中添加图片
- BT种子2磁力链接
- 磁力链接搜索引擎源码下载
- 磁力链接 结构解析 分享
- 向QTextEdit/QTextBrowser添加彩色文字与图片
- 向RichEditCtrl中添加图片和URL功能
- 使用POI向word中添加图片的问题
- maven 上传项目或者jar到私服
- ZOJ 3703 Happy Programming Contest 0-1背包 DP
- Sublime Text 3 使用总结
- ZOJ 1425 Crossed Matchings DP LCS
- ZOJ 3469 Food Delivery DP
- 向图片中添加磁力链接与提取
- 史上最浅显易懂的Git学习指南
- 费城考驾照
- Hadoop MapReduce处理海量小文件:压缩文件
- Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stoc
- Scala界面开发:Panel、Layout
- C++基础---数据类型
- 字符串匹配算法研究
- Box2D C++教程 第一节:简介