📄 infohidedoc.cpp
字号:
C[i]*=2.0;
}
}
void CInfoHideDoc::FCT(float *x, unsigned int *L, float *C, int m, int N)
{
int NK1,NK2,i,j,k,kk,ip,incr,L1,k1,k2,iter;
float T;
NK1=N>>1;
T=x[2];
x[2]=x[1];
x[1]=T;
k1=2;
k2=4;
for(i=1;i<(NK1-1);i++)
{
T=x[k2];
for(j=0;j<=(k2-k1);j++)
{
x[k2-j]=x[k2-j-1];
}
x[k1]=T;
k1++;
k2+=2;
}
NK2=N-1;
for(i=0;i<(NK1>>1);i++)
{
T=x[NK2-i];
x[NK2-i]=x[NK1+i];
x[NK1+i]=T;
}
ip=NK1;
kk=0;
incr=N;
for(iter=0;iter<m;iter++)
{
for(k=0;k<ip;k++)
{
for(j=k;j<N;j+=incr)
{
i=j+ip;
T=x[j];
x[j]=T+x[i];
x[i]=T-x[i];
x[i]*=C[kk];
}
kk++;
}
ip>>=1;
incr>>=1;
}
for(i=0;i<(N-1);i++)
{
if(i<=(int)L[i])
continue;
else
{
T=x[i];
x[i]=x[L[i]];
x[L[i]]=T;
}
}
for(i=1;i<NK1;i++)
x[i]*=0.5;
NK1=(N>>2);
NK2=(N>>1);
kk=1;
for(iter=1;iter<m;iter++)
{
kk<<=1;
L1=kk-1;
for(k=1;k<=L1;k++)
for(i=0;i<NK1;i++)
x[NK1+NK2*k+i]=x[NK1+NK2*k+i]-x[NK1+NK2*(k-1)+i];
NK1>>=1;
NK2>>=1;
}
x[0]=x[0]/(float)sqrt(N);
for(i=1;i<N;i++)
x[i]=(float)(x[i]*1.414/(float)sqrt(N));
}
void CInfoHideDoc::SetXY(int x, int y, BYTE val,int space)
{
y=m_size.cy-y-1;
lpbits[(y*m_size.cy+x)*3+space]=val;
if(lpbits[(y*m_size.cy+x)*3+space]>255)lpbits[(y*m_size.cy+x)*3+space]=255;
if(lpbits[(y*m_size.cy+x)*3+space]<0)lpbits[(y*m_size.cy+x)*3+space]=0;
}
void CInfoHideDoc::WTSINV(float *C, int m, int N)
{
int NK,i,k,iter,LK;
double PI;
PI=3.14159;
NK=4;
k=0;
LK=1;
for(iter=0;iter<m;iter++)
{
for(i=0;i<LK;i++)
{
C[k]=(float)(1.0/(float)cos((PI*(4*i+1))/NK));
k++;
}
NK<<=1;
LK<<=1;
}
for(i=1;i<(N-1);i++)
C[i]/=2.0;
}
void CInfoHideDoc::IFCT(float *x, unsigned int *L, float *C, int m, int N)
{
int NK1,NK2,i,j,k,kk,ip,incr,L1,iter;
float T;
x[0]=x[0]*(float)sqrt(N);
for(i=1;i<N;i++)
x[i]=(float)(x[i]*(float)sqrt(N)/1.4140);
NK1=1;
NK2=2;
kk=1;
for(i=0;i<m;i++)
kk*=2;
for(iter=1;iter<m;iter++)
{
kk>>=1;
L1=kk-1;
for(k=L1;k>=1;k--)
for(i=0;i<NK1;i++)
x[NK1+k*NK2+i]=x[NK1+k*NK2+i]+x[NK1+(k-1)*NK2+i];
NK1<<=1;
NK2<<=1;
}
NK1=N>>1;
for(i=1;i<NK1;i++)
x[i]*=2.0;
for(i=0;i<(N-1);i++)
{
if(i<(int)L[i])
continue;
else
{
T=x[i];
x[i]=x[L[i]];
x[L[i]]=T;
}
}
ip=1;
kk=0;
incr=2;
for(iter=0;iter<m;iter++)
{
for(k=0;k<ip;k++)
{
for(j=k;j<N;j+=incr)
{
i=j+ip;
T=x[j];
x[i]=x[i]*C[kk];
x[j]=T+x[i];
x[i]=T-x[i];
}
kk++;
}
ip<<=1;
incr<<=1;
}
kk=1;
for(i=1;i<(N>>1);i++)
{
T=x[N-1];
k=1;
for(j=kk;j<N;j++)
{
x[N-k]=x[N-k-1];
k++;
}
x[kk]=T;
kk+=2;
}
for(i=0;i<N;i++)
x[i]=x[i]/(float)(N);
}
void CInfoHideDoc::OnLsbE()
{
// TODO: Add your command handler code here
TypeChoice tc_pdlg;
if(tc_pdlg.DoModal()==IDOK)
{
if(tc_pdlg.m_wenzi)
{
INPUT_MW mw_pdlg;
if(mw_pdlg.DoModal()==IDOK)
{
BYTE len=mw_pdlg.m_miwen.GetLength();
BYTE *cchar;
cchar=new BYTE[len*8];
int i;
for(i=0;i<len;i++)
{
cchar[8*i]=mw_pdlg.m_miwen[i]%2;
cchar[8*i+1]=(mw_pdlg.m_miwen[i]>>1)%2;
cchar[8*i+2]=(mw_pdlg.m_miwen[i]>>2)%2;
cchar[8*i+3]=(mw_pdlg.m_miwen[i]>>3)%2;
cchar[8*i+4]=(mw_pdlg.m_miwen[i]>>4)%2;
cchar[8*i+5]=(mw_pdlg.m_miwen[i]>>5)%2;
cchar[8*i+6]=(mw_pdlg.m_miwen[i]>>6)%2;
cchar[8*i+7]=(mw_pdlg.m_miwen[i]>>7)%2;
}
lpbits[(m_size.cx*m_size.cy-1)*3]=(lpbits[(m_size.cx*m_size.cy-1)*3]>>1<<1)+len%2;
lpbits[(m_size.cx*m_size.cy-2)*3]=(lpbits[(m_size.cx*m_size.cy-2)*3]>>1<<1)+(len>>1)%2;
lpbits[(m_size.cx*m_size.cy-3)*3]=(lpbits[(m_size.cx*m_size.cy-3)*3]>>1<<1)+(len>>2)%2;
lpbits[(m_size.cx*m_size.cy-4)*3]=(lpbits[(m_size.cx*m_size.cy-4)*3]>>1<<1)+(len>>3)%2;
lpbits[(m_size.cx*m_size.cy-5)*3]=(lpbits[(m_size.cx*m_size.cy-5)*3]>>1<<1)+(len>>4)%2;
lpbits[(m_size.cx*m_size.cy-6)*3]=(lpbits[(m_size.cx*m_size.cy-6)*3]>>1<<1)+(len>>5)%2;
lpbits[(m_size.cx*m_size.cy-7)*3]=(lpbits[(m_size.cx*m_size.cy-7)*3]>>1<<1)+(len>>6)%2;
lpbits[(m_size.cx*m_size.cy-8)*3]=(lpbits[(m_size.cx*m_size.cy-8)*3]>>1<<1)+(len>>7)%2;
len=len*8;
i=0;
while(1){
lpbits[i*3]=(lpbits[i*3]>>1<<1)+cchar[i];
i=i+1;
if(i==len)break;
}
free(cchar);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
if(tc_pdlg.m_tuxiang)
{
JM_PIC jp_pdlg;
if(jp_pdlg.DoModal()==IDOK)
{
CFile fp;//指定的位图文件
fp.Open(jp_pdlg.m_picinfo,CFile::modeRead);
fp.Read((LPSTR)&mm_bmh,sizeof(BITMAPFILEHEADER));
if(mm_bmh.bfType!=0x4D42)//判断文件是否为位图
{
AfxMessageBox("不是合法的文件!");
fp.Close();
return;
}
DWORD dwBitsSize=mm_bmh.bfSize;
mm_lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-sizeof(BITMAPFILEHEADER));
fp.Read(mm_lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));
if((mm_lpbmi->bmiHeader.biBitCount!=24)||(mm_lpbmi->bmiHeader.biCompression!=BI_RGB))
{//判断该位图是否为24位非压缩位图
AfxMessageBox("该位图不是我们需要的24位位图!");
GlobalFreePtr(mm_lpbmi);
mm_lpbmi=NULL;
fp.Close();
return;
}
mm_lpbits=(LPBYTE)mm_lpbmi+sizeof(BITMAPINFOHEADER);
mm_m_size.cx=mm_lpbmi->bmiHeader.biWidth;//得到位图宽度
mm_m_size.cy=mm_lpbmi->bmiHeader.biHeight;//得到位图高度
fp.Close();//关闭文件
int b_times;//求得载体图像与秘密图像的比例
b_times=m_size.cx/mm_m_size.cx;
for(int i=0;i<mm_m_size.cy;i++)
for(int j=0;j<mm_m_size.cx;j++)
{
lpbits[((i*mm_m_size.cx+j)*8)*3]=(lpbits[((i*mm_m_size.cx+j)*8)*3]>>1<<1)
+mm_lpbits[(i*mm_m_size.cx+j)*3]%2;
lpbits[((i*mm_m_size.cx+j)*8+1)*3]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>1)%2;
lpbits[((i*mm_m_size.cx+j)*8+2)*3]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>2)%2;
lpbits[((i*mm_m_size.cx+j)*8+3)*3]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>3)%2;
lpbits[((i*mm_m_size.cx+j)*8+4)*3]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>4)%2;
lpbits[((i*mm_m_size.cx+j)*8+5)*3]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>5)%2;
lpbits[((i*mm_m_size.cx+j)*8+6)*3]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>6)%2;
lpbits[((i*mm_m_size.cx+j)*8+7)*3]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>7)%2;
lpbits[((i*mm_m_size.cx+j)*8)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8)*3+1]>>1<<1)
+mm_lpbits[(i*mm_m_size.cx+j)*3+1]%2;
lpbits[((i*mm_m_size.cx+j)*8+1)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>1)%2;
lpbits[((i*mm_m_size.cx+j)*8+2)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>2)%2;
lpbits[((i*mm_m_size.cx+j)*8+3)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>3)%2;
lpbits[((i*mm_m_size.cx+j)*8+4)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>4)%2;
lpbits[((i*mm_m_size.cx+j)*8+5)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>5)%2;
lpbits[((i*mm_m_size.cx+j)*8+6)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>6)%2;
lpbits[((i*mm_m_size.cx+j)*8+7)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3+1]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>7)%2;
lpbits[((i*mm_m_size.cx+j)*8)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8)*3+2]>>1<<1)
+mm_lpbits[(i*mm_m_size.cx+j)*3+2]%2;
lpbits[((i*mm_m_size.cx+j)*8+1)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>1)%2;
lpbits[((i*mm_m_size.cx+j)*8+2)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>2)%2;
lpbits[((i*mm_m_size.cx+j)*8+3)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>3)%2;
lpbits[((i*mm_m_size.cx+j)*8+4)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>4)%2;
lpbits[((i*mm_m_size.cx+j)*8+5)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>5)%2;
lpbits[((i*mm_m_size.cx+j)*8+6)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>6)%2;
lpbits[((i*mm_m_size.cx+j)*8+7)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3+2]>>1<<1)
+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>7)%2;
}
lpbits[(m_size.cx*m_size.cy-1)*3]=(lpbits[(m_size.cx*m_size.cy-1)*3]>>1<<1)+mm_m_size.cx%2;
lpbits[(m_size.cx*m_size.cy-2)*3]=(lpbits[(m_size.cx*m_size.cy-2)*3]>>1<<1)+(mm_m_size.cx>>1)%2;
lpbits[(m_size.cx*m_size.cy-3)*3]=(lpbits[(m_size.cx*m_size.cy-3)*3]>>1<<1)+(mm_m_size.cx>>2)%2;
lpbits[(m_size.cx*m_size.cy-4)*3]=(lpbits[(m_size.cx*m_size.cy-4)*3]>>1<<1)+(mm_m_size.cx>>3)%2;
lpbits[(m_size.cx*m_size.cy-5)*3]=(lpbits[(m_size.cx*m_size.cy-5)*3]>>1<<1)+(mm_m_size.cx>>4)%2;
lpbits[(m_size.cx*m_size.cy-6)*3]=(lpbits[(m_size.cx*m_size.cy-6)*3]>>1<<1)+(mm_m_size.cx>>5)%2;
lpbits[(m_size.cx*m_size.cy-7)*3]=(lpbits[(m_size.cx*m_size.cy-7)*3]>>1<<1)+(mm_m_size.cx>>6)%2;
lpbits[(m_size.cx*m_size.cy-8)*3]=(lpbits[(m_size.cx*m_size.cy-8)*3]>>1<<1)+(mm_m_size.cx>>7)%2;
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
//声音隐藏算法暂时没做,可继续完成,原理相同
/*
if(tc_pdlg.m_shengyin)
{
}
*/
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::OnLsbD()
{
// TODO: Add your command handler code here
TypeChoice tc_pdlg;
if(tc_pdlg.DoModal()==IDOK)
{
if(tc_pdlg.m_wenzi)
{
int len;
len=lpbits[(m_size.cx*m_size.cy-1)*3]%2+(lpbits[(m_size.cx*m_size.cy-2)*3]%2)*2
+(lpbits[(m_size.cx*m_size.cy-3)*3]%2)*4+(lpbits[(m_size.cx*m_size.cy-4)*3]%2)*8
+(lpbits[(m_size.cx*m_size.cy-5)*3]%2)*16+(lpbits[(m_size.cx*m_size.cy-6)*3]%2)*32
+(lpbits[(m_size.cx*m_size.cy-7)*3]%2)*64+(lpbits[(m_size.cx*m_size.cy-8)*3]%2)*128;
char *cchar;
cchar=new char[len];
cchar[len]='\0';
for(int i=0;i<len*8;i=i+8)
{
cchar[i/8]=lpbits[i*3]%2+(lpbits[(i+1)*3]%2)*2
+(lpbits[(i+2)*3]%2)*4+(lpbits[(i+3)*3]%2)*8
+(lpbits[(i+4)*3]%2)*16+(lpbits[(i+5)*3]%2)*32
+(lpbits[(i+6)*3]%2)*64+(lpbits[(i+7)*3]%2)*128;
}
CString chprint=cchar;
AfxMessageBox(chprint);
}
if(tc_pdlg.m_tuxiang)
{
int len;
len=lpbits[(m_size.cx*m_size.cy-1)*3]%2+(lpbits[(m_size.cx*m_size.cy-2)*3]%2)*2
+(lpbits[(m_size.cx*m_size.cy-3)*3]%2)*4+(lpbits[(m_size.cx*m_size.cy-4)*3]%2)*8
+(lpbits[(m_size.cx*m_size.cy-5)*3]%2)*16+(lpbits[(m_size.cx*m_size.cy-6)*3]%2)*32
+(lpbits[(m_size.cx*m_size.cy-7)*3]%2)*64+(lpbits[(m_size.cx*m_size.cy-8)*3]%2)*128;
mm_lpbits=new unsigned char[len*len*3];
for(int i=0;i<len;i++)
for(int j=0;j<len;j++)
{
mm_lpbits[(i*len+j)*3]=(lpbits[((i*len+j)*8)*3]%2)+(lpbits[((i*len+j)*8+1)*3]%2)*2
+(lpbits[((i*len+j)*8+2)*3]%2)*4+(lpbits[((i*len+j)*8+3)*3]%2)*8
+(lpbits[((i*len+j)*8+4)*3]%2)*16+(lpbits[((i*len+j)*8+5)*3]%2)*32
+(lpbits[((i*len+j)*8+6)*3]%2)*64+(lpbits[((i*len+j)*8+7)*3]%2)*128;
mm_lpbits[(i*len+j)*3+1]=(lpbits[((i*len+j)*8)*3+1]%2)+(lpbits[((i*len+j)*8+1)*3+1]%2)*2
+(lpbits[((i*len+j)*8+2)*3+1]%2)*4+(lpbits[((i*len+j)*8+3)*3+1]%2)*8
+(lpbits[((i*len+j)*8+4)*3+1]%2)*16+(lpbits[((i*len+j)*8+5)*3+1]%2)*32
+(lpbits[((i*len+j)*8+6)*3+1]%2)*64+(lpbits[((i*len+j)*8+7)*3+1]%2)*128;
mm_lpbits[(i*len+j)*3+2]=(lpbits[((i*len+j)*8)*3+2]%2)+(lpbits[((i*len+j)*8+1)*3+2]%2)*2
+(lpbits[((i*len+j)*8+2)*3+2]%2)*4+(lpbits[((i*len+j)*8+3)*3+2]%2)*8
+(lpbits[((i*len+j)*8+4)*3+2]%2)*16+(lpbits[((i*len+j)*8+5)*3+2]%2)*32
+(lpbits[((i*len+j)*8+6)*3+2]%2)*64+(lpbits[((i*len+j)*8+7)*3+2]%2)*128;
}
for(i=0;i<len*len*3;i++)lpbits[i]=mm_lpbits[i];
mm_m_size.cx=len;
mm_m_size.cy=len;
mm_lpbmi->bmiHeader.biWidth=len;
mm_lpbmi->bmiHeader.biHeight=len;
mm_lpbmi->bmiHeader.biSizeImage=len*len*3;
mm_bmh.bfSize=len*len*3+54;
trans=1;
UpdateAllViews(NULL);
SetModifiedFlag();
}
//声音隐藏算法暂时没做,可继续完成,原理相同
/*
if(tc_pdlg.m_shengyin)
{
}
*/
}
}
void CInfoHideDoc::OnBmp2jpeg()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -