基于图片的信息隐藏与显示

在做一个车牌识别项目时想到的,但是把这代码拿给老师看了才知道这是比较简单的加密了(本来还以为想到什么好点子),所以拿出了和大家分享下。这只是利用了Opencv而已,你也可以用纯c++,java,C#来写,只不过我做车牌识别时恰巧用到了Opencv所以就直接用了。关于opencv的安装os里面有篇文章写得不错http://my.oschina.net/gujianhan/blog/162120,在我这代码里除了对像素的操作借助了opencv其他的还都是c++。所以没有下面评论说的头文件也不是问题。运行之后你会发现两张图片完全一样,但是信息就是隐藏在图片里了

#include<iostream>
#include"highgui.h"
#include<vector>
#include"cv.h"
#include<fstream>
using  namespace  std;
using  namespace  cv;
void  readInformation(IplImage * imgSrc);
void  roatedImage(IplImage *imgSrc){
     CvScalar t1,t2;
     IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->height,imgSrc->width),
         imgSrc->depth,imgSrc->nChannels);
     for ( int  i=0;i<imgSrc->height;i++)
         for ( int  j=0;j<imgSrc->width;j++){
             t1=cvGet2D(imgSrc,i,j);
             cvSet2D(imgCopy,j,i,t1);
         }
         cvSaveImage( "D:\\Opencv\\testSave.jpg" ,imgCopy);
}
int  addInformation(IplImage *imgSrc){
     CvScalar t1,t2;
     IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->width,imgSrc->height),
         imgSrc->depth,imgSrc->nChannels);
     string str= "" ;
     cout<< "请输入你想要加入的文本:" <<endl;
     getline(cin,str);
     int  length=0;
     for ( int  i=0;i<imgSrc->height;i++)
         for ( int  j=0;j<imgSrc->width;j++){
             if (length<str.length()){
                 t1=cvGet2D(imgSrc,i,j);
                 t1.val[0]=str[length];
                 cvSet2D(imgCopy,i,j,t1);
                 length++;
             }
             else {
             t1=cvGet2D(imgSrc,i,j);
             cvSet2D(imgCopy,i,j,t1);
             }
         }
         Mat mat(imgCopy);
         string path;
         cout<< "输入图片保存路径(请保存为png格式):" <<endl;
         cin>>path;
         imwrite(path.c_str(),mat);
         return  str.length();
}
void  readInformation(IplImage * imgSrc, int  wordNumber){
     int  length=0;
     CvScalar t1,t2;
     for ( int  i=0;i<imgSrc->height;i++){
         for ( int  j=0;j<imgSrc->width;j++){
             if (length<wordNumber){
                 t1=cvGet2D(imgSrc,i,j);
                 char  ch=( int )t1.val[0];
                 cout<<ch;
                 length++;
             }
             if (length>=wordNumber)
                 break ;
         }
         }
}
///*
//改进函数
//*/
string toBinary( int  num){
     string str= "" ;
     do {
         int  remaider=num%2;
         num=num/2;
         str+=to_string(remaider);
     } while (num);
     string str2= "" ;
     for ( int  i=str.length()-1;i>=0;i--)
         str2+=str[i];
     int  addNum=7-str2.length();
     string str3= "" ;
     for ( int  i=0;i<addNum;i++)
         str3+= "0" ;
     str2=str3+str2+ "00" ;
     return  str2;
}
 
char  toChar(string strNumber){
     strNumber=strNumber.substr(0,7);
     int  sum=0;
     for ( int  i=0;i<strNumber.length();i++)
         sum+=(strNumber[i]- '0' )* pow (2,(strNumber.length()-i-1));
     char  ch=sum;
     return  ch;
}
 
int  addInformation3(IplImage *imgSrc){
     CvScalar t0,t1,t2;
     IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->width,imgSrc->height),
         imgSrc->depth,imgSrc->nChannels);
     string str= "" ;
     cout<< "请输入你想要加入的文本用#结束:" <<endl;
     getline(cin,str);
     vector<string> vestr_3;
     for ( int  i=0;i<str.length();i++)
     {
         string tmp=toBinary(str[i]);
         string tmp1=tmp.substr(0,3);
         string tmp2=tmp.substr(3,3);
         string tmp3=tmp.substr(6,3);
         vestr_3.push_back(tmp1);
         vestr_3.push_back(tmp2);
         vestr_3.push_back(tmp3);
     }
     int  length=0;
     for ( int  i=0;i<imgSrc->height;i++)
         for ( int  j=0;j<imgSrc->width;j++){
             if (length<vestr_3.size()*3)
             {
                 t1=cvGet2D(imgSrc,i,j);
                 string tmp=vestr_3[length/3];
                 for ( int  m=0;m<3;m++)
                 {
                     if (tmp[m]== '1' )
                         t1.val[m]+=1;
                     if (tmp[m]== '0' )
                         t1.val[m]-=1;
                 }
                 cvSet2D(imgCopy,i,j,t1);
                 length+=3;
             }
             else
             {
             t1=cvGet2D(imgSrc,i,j);
             cvSet2D(imgCopy,i,j,t1);
             }
             }
         
         Mat mat(imgCopy);
         string path;
         cout<< "输入图片保存路径(请保存为png格式):" ;
         cin>>path;
         imwrite(path.c_str(),mat);
         return  str.length();
         
}
void  readInformation3(IplImage * imgSrc,IplImage* imgCopy){
     int  length=0;
     CvScalar t1,t2;
     int  count2=0;
     string tmp2= "" ;
     for ( int  i=0;i<imgSrc->height;i++){
         for ( int  j=0;j<imgSrc->width;j++){
             t1=cvGet2D(imgSrc,i,j);
             t2=cvGet2D(imgCopy,i,j);
             string tmp= "" ;
             tmp+=to_string(t2.val[0]-t1.val[0]>0?1:0);
             tmp+=to_string(t2.val[1]-t1.val[1]>0?1:0);
             tmp+=to_string(t2.val[2]-t1.val[2]>0?1:0);
             if (count2<3){
             tmp2+=tmp;
             count2++;
             }
             if (count2==3){
             char  ch=toChar(tmp2);
             if ( '#' ==ch) return  ;
             cout<<ch;
             count2=0;
             tmp2= "" ;
         }
         }
         }
}
void  menu(){
     int  choice;
     cout<< "****************************NUPT B12 NIIT  Liyao**************************" <<endl;
     cout<< "**********1:选择图片加入信息****2:读取图片里面的信息****3:退出**********" <<endl;
     string path;
     string path2;
     cin>>choice;
     switch (choice){
     case  1:
         {
         cout<< "输入原图片的路径:" ;
         cin>>path;
         getchar ();
         IplImage *imgSrc=cvLoadImage(path.c_str(),-1);
         addInformation3(imgSrc);
         }
         break ;
     case  2:
         {
         cout<< "输入原图片和改变后图片的路径:" <<endl;
         cout<< "原图片路径:" ;
         cin>>path;
         cout<< "改变后图片的路径:" ;
         cin>>path2;
         cout<<endl;
         IplImage *imgSrc2=cvLoadImage(path.c_str(),-1);
         IplImage *imgCopy=cvLoadImage(path2.c_str(),-1);
         readInformation3(imgSrc2,imgCopy);
         cout<<endl;
         }
         break ;
     case  3:
         exit (1);
         break ;
     default :
         cout<< "错误指令!" <<endl;
     }
}
int  main(){
     do {
         menu();
     } while (1);
}

下面分别是我使用的原图片和改变后的图片以及程序运行截图:

转载请注明出处http://www.cnblogs.com/BasilLee/p/3741200.html。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用MFC框架中的CBitmapButton类来实现图片页面跳转功能。这个类可以创建一个按钮,它的外观是一个位图图像。 首先,您需要在资源编辑器中导入您要使用的位图图像,并创建一个按钮控件。然后,在您的对话框类中添加一个CBitmapButton类型的成员变量,例如: ``` class CMyDialog : public CDialog { public: CBitmapButton m_button; // ... }; ``` 在OnInitDialog()函数中,您需要将该成员变量与资源编辑器中的按钮控件关联起来: ``` BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); m_button.SubclassDlgItem(IDC_BUTTON1, this); // IDC_BUTTON1为资源编辑器中的按钮ID return TRUE; } ``` 最后,在您的代码中,您可以使用CBitmapButton类的函数来设置按钮的位图图像,例如: ``` m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2); // IDB_BITMAP1和IDB_BITMAP2为资源编辑器中的位图图像ID ``` 当按钮被单击时,您可以在响应函数中执行页面跳转的代码。例如,使用CDialog类的EndDialog()函数关闭当前对话框并返回一个值,从而跳转到另一个对话框: ``` void CMyDialog::OnButtonClicked() { // 执行页面跳转的代码... EndDialog(IDOK); // 关闭当前对话框并返回IDOK } ``` ### 回答2: 在基于VC(Visual C++)环境下,实现图片页面跳转可以通过多种方式来实现。 一种方法是使用MFC框架中的CButton类或者CStatic类来创建一个按钮或者静态控件,并通过其点击事件或者双击事件来触发页面跳转操作。在事件处理函数中,可以通过调用相关函数或者方法来进行页面跳转的操作,比如调用窗口的ShowWindow函数来显示或者隐藏窗口,或者调用CDialog类的DoModal或者Create函数来打开或者创建新的窗口。 另一种方法是使用Web控件来实现图片页面跳转。可以使用MFC框架中的CHtmlView类或者CWebBrowser控件来加载并显示一个网页,并通过网页中的链接或者点击事件来实现页面跳转的功能。通过设置相关的属性和调用相应的方法,可以实现加载指定的图片页面、处理页面跳转事件等操作。 此外,还可以使用其他第三方库或者工具来实现图片页面跳转的功能,比如使用ActiveX控件、Qt框架的QWebView类等等。具体实现的方式和步骤会根据所选择的具体方法有所不同。 无论使用哪种方法,需要根据具体需求进行设计和编写代码,实现图片页面跳转的功能。 ### 回答3: 在以VC环境下进行图片页面跳转的过程中,首先需要将图片文件加载到程序中。可以通过使用VC提供的图片加载函数来实现,例如LoadImage()函数。此函数可以加载图片文件,并返回一个指向位图句柄的值。 加载图片后,可以将其显示在程序窗口中。可以使用VC提供的图片显示控件(如CStatic)来显示图片。通过设置控件的属性来加载并显示位图。 当点击图片时,可以通过处理鼠标点击事件来实现页面跳转。可以使用VC提供的消息映射机制,在响应WM_LBUTTONDOWN消息时进行处理。在该消息处理函数中,可以执行页面跳转的相关操作。 例如,可以使用CDialog类中的DoModal()函数来打开另一个对话框。通过创建一个新的对话框对象并调用DoModal()函数来显示该对话框。可以在DoModal()函数返回之后进一步处理页面跳转后的逻辑。 另外,还可以通过使用一些网页开发技术来实现图片页面跳转。例如,通过在图片上添加一个超链接,点击图片时跳转到目标页面。可以使用HTML标签和CSS样式来实现这个效果。可以在VC程序中嵌入一个浏览器控件(如CWebBrowserCtrl),通过加载包含链接的HTML页面来显示图片实现跳转。 综上所述,基于VC环境下的图片页面跳转可以通过加载图片显示图片、处理鼠标点击事件等步骤来实现。根据具体需求,可以选择合适的技术和控件来完成相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值