📄 infohidedoc.cpp
字号:
{
// TODO: Add your command handler code here
BMPTOJPEG2K b2j_pdlg;
b2j_pdlg.DoModal();
}
void CInfoHideDoc::OnRgbtogray()
{
// TODO: Add your command handler code here
BYTE *buffer;
buffer=new BYTE[m_size.cx*m_size.cy];
int i,j;
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
buffer[i*m_size.cx+j]=lpbits[(i*m_size.cx+j)*3]*0.3+
lpbits[(i*m_size.cx+j)*3+1]*0.59+lpbits[(i*m_size.cx+j)*3+2]*0.11;
}
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
lpbits[1024+i*m_size.cx+j]=buffer[i*m_size.cx+j];
}
lpbits=lpbits+1024;
bmh.bfSize=m_size.cx*m_size.cy+1078;
bmh.bfOffBits=1078;
lpbmi->bmiHeader.biBitCount=8;
lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy;
for(i=0;i<256;i++)
{
lpbmi->bmiColors[i].rgbRed =(BYTE)i;
lpbmi->bmiColors[i].rgbGreen =(BYTE)i;
lpbmi->bmiColors[i].rgbBlue =(BYTE)i;
lpbmi->bmiColors[i].rgbReserved=(BYTE)i;
}
free(buffer);
buffer=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::OnRgbto2()
{
// TODO: Add your command handler code here
BYTE *buffer;
buffer=new BYTE[m_size.cx*m_size.cy];
int i,j;
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
if((lpbits[(i*m_size.cx+j)*3]*0.3+
lpbits[(i*m_size.cx+j)*3+1]*0.59+lpbits[(i*m_size.cx+j)*3+2]*0.11)>127)
buffer[i*m_size.cx+j]=1;
else buffer[i*m_size.cx+j]=0;
}
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j=j+8)
{
lpbits[8+(i*m_size.cx+j)/8]=(buffer[i*m_size.cx+j]<<7)+(buffer[i*m_size.cx+j+1]<<6)
+(buffer[i*m_size.cx+j+2]<<5)+(buffer[i*m_size.cx+j+3]<<4)
+(buffer[i*m_size.cx+j+4]<<3)+(buffer[i*m_size.cx+j+5]<<2)
+(buffer[i*m_size.cx+j+6]<<1)+(buffer[i*m_size.cx+j+7]);
}
lpbits=lpbits+8;
bmh.bfSize=m_size.cx*m_size.cy/8+62;
bmh.bfOffBits=62;
lpbmi->bmiHeader.biBitCount=1;
lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy/8;
lpbmi->bmiColors[0].rgbRed =(BYTE)0;
lpbmi->bmiColors[0].rgbGreen =(BYTE)0;
lpbmi->bmiColors[0].rgbBlue =(BYTE)0;
lpbmi->bmiColors[0].rgbReserved=(BYTE)0;
lpbmi->bmiColors[1].rgbRed =(BYTE)255;
lpbmi->bmiColors[1].rgbGreen =(BYTE)255;
lpbmi->bmiColors[1].rgbBlue =(BYTE)255;
lpbmi->bmiColors[1].rgbReserved=(BYTE)255;
free(buffer);
buffer=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
unsigned char BayerPattern[8][8]={0,32, 8,40, 2,34,10,42,
48,16,56,24,50,18,58,26,
12,44, 4,36,14,46, 6,38,
60,28,52,20,62,30,54,22,
3,35,11,43, 1,33, 9,41,
51,19,59,27,49,17,57,25,
15,47, 7,39,13,45, 5,37,
63,31,55,23,61,29,53,21};
#define ISPAL_PATTERN_SIZE 64 /* 离散数据最大尺寸 */
#define ISPAL_BEGIN 64 /* 调色板分量起始量 */
#define ISPAL_END 224 /* 调色板分量最高值 */
#define ISPAL_STEP 32 /* 调色板分量间隔 */
void CInfoHideDoc::OnRgbto256()
{
// TODO: Add your command handler code here
int i,j;
BYTE *buffer;
buffer=new BYTE[m_size.cx*m_size.cy];
unsigned long *pal_buffer;
pal_buffer=new unsigned long[256];
Creat256Palette(pal_buffer);
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
buffer[i*m_size.cx+j]=CnvTo256PalIndex(j,i,lpbits[(i*m_size.cx+j)*3+2],
lpbits[(i*m_size.cx+j)*3+1],lpbits[(i*m_size.cx+j)*3]);
}
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
lpbits[1024+i*m_size.cx+j]=buffer[i*m_size.cx+j];
}
lpbits=lpbits+1024;
bmh.bfSize=m_size.cx*m_size.cy+1078;
bmh.bfOffBits=1078;
lpbmi->bmiHeader.biBitCount=8;
lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy;
for(i=0;i<256;i++)
{
lpbmi->bmiColors[i].rgbRed =(BYTE)((pal_buffer[i]>>16)%256);
lpbmi->bmiColors[i].rgbGreen =(BYTE)((pal_buffer[i]>>8)%256);
lpbmi->bmiColors[i].rgbBlue =(BYTE)(pal_buffer[i]%256);
lpbmi->bmiColors[i].rgbReserved=(BYTE)i;
}
free(buffer);
buffer=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
int CInfoHideDoc::Creat256Palette(unsigned long *pal)
{
unsigned long r, g, b;
int cnt = 0;
/* 标准调色板 */
for (r=ISPAL_BEGIN; r<256; r+=ISPAL_STEP)
{
for (g=ISPAL_BEGIN; g<256; g+=ISPAL_STEP)
{
for (b=ISPAL_BEGIN; b<256; b+=ISPAL_STEP)
{
pal[cnt++] = b|(g<<8)|(r<<16);
}
}
}
/* 返回调色板使用项个数 */
return cnt;
}
unsigned long CInfoHideDoc::CnvTo256PalIndex(int x,/* 该象素在图象中的水平位置 */
int y,/* 该象素在图象中的垂直位置 */
unsigned char ucr, /* 象素的R份量 */
unsigned char ucg,/* 象素的G份量 */
unsigned char ucb/* 象素的B份量 */
)
{
unsigned long pix = 0;
if (ucb > ISPAL_BEGIN)
{
ucb = (((ISPAL_PATTERN_SIZE*((unsigned int)ucb%ISPAL_STEP))/ISPAL_STEP) <
BayerPattern[y&7][x&7]) ? ((unsigned int)ucb/ISPAL_STEP)*ISPAL_STEP :
min(((unsigned int)ucb/ISPAL_STEP)*ISPAL_STEP+ISPAL_STEP, ISPAL_END);
}
else
{
ucb = ISPAL_BEGIN;
}
if (ucg > ISPAL_BEGIN)
{
ucg = (((ISPAL_PATTERN_SIZE*((unsigned int)ucg%ISPAL_STEP))/ISPAL_STEP) <
BayerPattern[y&7][x&7]) ? ((unsigned int)ucg/ISPAL_STEP)*ISPAL_STEP :
min(((unsigned int)ucg/ISPAL_STEP)*ISPAL_STEP+ISPAL_STEP, ISPAL_END);
}
else
{
ucg = ISPAL_BEGIN;
}
if (ucr > ISPAL_BEGIN)
{
ucr = (((ISPAL_PATTERN_SIZE*((unsigned int)ucr%ISPAL_STEP))/ISPAL_STEP) <
BayerPattern[y&7][x&7]) ? ((unsigned int)ucr/ISPAL_STEP)*ISPAL_STEP :
min(((unsigned int)ucr/ISPAL_STEP)*ISPAL_STEP+ISPAL_STEP, ISPAL_END);
}
else
{
ucr = ISPAL_BEGIN;
}
pix = ((unsigned long)ucr<<16)|((unsigned long)ucg<<8)|((unsigned long)ucb);
/* 返回该象素在调色板中的索引值 */
return (((pix&0xff)-ISPAL_BEGIN)/ISPAL_STEP)+
(((((pix&0xff00)>>8)-ISPAL_BEGIN)/ISPAL_STEP)*6)+
(((((pix&0xff0000)>>16)-ISPAL_BEGIN)/ISPAL_STEP)*36);
}
void CInfoHideDoc::OnVideoPar()//视频参数的调节
{
// TODO: Add your command handler code here
VIDEO_PAR vp_pdlg;
if(vp_pdlg.DoModal()==IDOK)
{
int i,j;
int Y,Cb,Cr,u,v;
if(vp_pdlg.m_slider_bri!=50)//亮度
{
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{//改变亮度算法
Y=0.114*lpbits[(i*m_size.cx+j)*3]+0.587*lpbits[(i*m_size.cx+j)*3+1]
+0.299*lpbits[(i*m_size.cx+j)*3+2];
if(Y>234)Y=234;
if(Y<17)Y=17;
Cb=128+0.5*lpbits[(i*m_size.cx+j)*3]-0.3313*lpbits[(i*m_size.cx+j)*3+1]
-0.1687*lpbits[(i*m_size.cx+j)*3+2];
if(Cb>190)Cb=190;
if(Cb<66)Cb=66;
Cr=128-0.0813*lpbits[(i*m_size.cx+j)*3]-0.4187*lpbits[(i*m_size.cx+j)*3+1]
+0.5*lpbits[(i*m_size.cx+j)*3+2];
if(Cr>207)Cr=207;
if(Cr<49)Cr=49;
if(vp_pdlg.m_slider_bri>50)Y=Y+(234-Y)*(vp_pdlg.m_slider_bri-50)/50;
else Y=Y+(Y-17)*(vp_pdlg.m_slider_bri-50)/50;
if((Y+1.772*(Cb-128))>255)lpbits[(i*m_size.cx+j)*3]=255;
else if((Y+1.772*(Cb-128))<0)lpbits[(i*m_size.cx+j)*3]=0;
else lpbits[(i*m_size.cx+j)*3]=Y+1.772*(Cb-128);
if((Y-0.34414*(Cb-128)-0.71414*(Cr-128))>255)lpbits[(i*m_size.cx+j)*3+1]=255;
else if((Y-0.34414*(Cb-128)-0.71414*(Cr-128))<0)lpbits[(i*m_size.cx+j)*3+1]=0;
else lpbits[(i*m_size.cx+j)*3+1]=Y-0.34414*(Cb-128)-0.71414*(Cr-128);
if((Y+1.402*(Cr-128))>255)lpbits[(i*m_size.cx+j)*3+2]=255;
else if((Y+1.402*(Cr-128))<0)lpbits[(i*m_size.cx+j)*3+2]=0;
else lpbits[(i*m_size.cx+j)*3+2]=Y+1.402*(Cr-128);
}
}
if(vp_pdlg.m_slider_sat!=50)//饱和度
{
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{//改变饱和度算法
Y=0.114*lpbits[(i*m_size.cx+j)*3]+0.587*lpbits[(i*m_size.cx+j)*3+1]
+0.299*lpbits[(i*m_size.cx+j)*3+2];
if(Y>255)Y=255;
if(Y<0)Y=0;
u=0.437*lpbits[(i*m_size.cx+j)*3]-0.289*lpbits[(i*m_size.cx+j)*3+1]
-0.147*lpbits[(i*m_size.cx+j)*3+2];
// if(u>255)u=255;
// if(u<0)u=0;
v=-0.1*lpbits[(i*m_size.cx+j)*3]-0.515*lpbits[(i*m_size.cx+j)*3+1]
+0.615*lpbits[(i*m_size.cx+j)*3+2];
// if(v>255)v=255;
// if(v<0)v=0;
if(vp_pdlg.m_slider_sat>50)//时间关系,增大饱和度未做
{
}
else//减小饱和度
{
u=u+u*(vp_pdlg.m_slider_sat-50)/50;
v=v+v*(vp_pdlg.m_slider_sat-50)/50;
}
if((Y+2.032*u)>255)lpbits[(i*m_size.cx+j)*3]=255;
else if((Y+2.032*u)<0)lpbits[(i*m_size.cx+j)*3]=0;
else lpbits[(i*m_size.cx+j)*3]=Y+2.032*u;
if((Y-0.395*u-0.581*v)>255)lpbits[(i*m_size.cx+j)*3+1]=255;
else if((Y-0.395*u-0.581*v)<0)lpbits[(i*m_size.cx+j)*3+1]=0;
else lpbits[(i*m_size.cx+j)*3+1]=Y-0.395*u-0.581*v;
if((Y+1.14*v)>255)lpbits[(i*m_size.cx+j)*3+2]=255;
else if((Y+1.14*v)<0)lpbits[(i*m_size.cx+j)*3+2]=0;
else lpbits[(i*m_size.cx+j)*3+2]=Y+1.14*v;
}
}
if(vp_pdlg.m_slider_con!=50)//对比度
{
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{//改变对比度算法
Y=0.114*lpbits[(i*m_size.cx+j)*3]+0.587*lpbits[(i*m_size.cx+j)*3+1]
+0.299*lpbits[(i*m_size.cx+j)*3+2];
if(Y>234)Y=234;
if(Y<17)Y=17;
Cb=128+0.5*lpbits[(i*m_size.cx+j)*3]-0.3313*lpbits[(i*m_size.cx+j)*3+1]
-0.1687*lpbits[(i*m_size.cx+j)*3+2];
if(Cb>190)Cb=190;
if(Cb<66)Cb=66;
Cr=128-0.0813*lpbits[(i*m_size.cx+j)*3]-0.4187*lpbits[(i*m_size.cx+j)*3+1]
+0.5*lpbits[(i*m_size.cx+j)*3+2];
if(Cr>207)Cr=207;
if(Cr<49)Cr=49;
if(vp_pdlg.m_slider_con>50)//增大对比度
{
if(Y>125)//原始亮度大于平均值
{
Y=Y+(234-Y)*(vp_pdlg.m_slider_con-50)/50;
}
else//原始亮度小于平均值
{
Y=Y+(17-Y)*(vp_pdlg.m_slider_con-50)/50;
}
}
else//减小对比度
{
Y=Y+(Y-125)*(vp_pdlg.m_slider_con-50)/50;
}
if((Y+1.772*(Cb-128))>255)lpbits[(i*m_size.cx+j)*3]=255;
else if((Y+1.772*(Cb-128))<0)lpbits[(i*m_size.cx+j)*3]=0;
else lpbits[(i*m_size.cx+j)*3]=Y+1.772*(Cb-128);
if((Y-0.34414*(Cb-128)-0.71414*(Cr-128))>255)lpbits[(i*m_size.cx+j)*3+1]=255;
else if((Y-0.34414*(Cb-128)-0.71414*(Cr-128))<0)lpbits[(i*m_size.cx+j)*3+1]=0;
else lpbits[(i*m_size.cx+j)*3+1]=Y-0.34414*(Cb-128)-0.71414*(Cr-128);
if((Y+1.402*(Cr-128))>255)lpbits[(i*m_size.cx+j)*3+2]=255;
else if((Y+1.402*(Cr-128))<0)lpbits[(i*m_size.cx+j)*3+2]=0;
else lpbits[(i*m_size.cx+j)*3+2]=Y+1.402*(Cr-128);
}
}
if(vp_pdlg.m_slider_hue!=0)//色调
{//时间关系,色调未做!
}
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::OnRobert()
{
// TODO: Add your command handler code here
//Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;
int i,j,*pbuffer;
pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
}
for(i=0;i<(m_size.cy-1);i++)
for(j=0;j<(m_size.cx-1);j++)
{
lpbits[(i*m_size.cx+j)*3]=abs(pbuffer[(i*m_size.cx+j)*3]-pbuffer[((i+1)*m_size.cx+j+1)*3])
+abs(pbuffer[((i+1)*m_size.cx+j)*3]-pbuffer[(i*m_size.cx+j+1)*3]);
lpbits[(i*m_size.cx+j)*3+1]=abs(pbuffer[(i*m_size.cx+j)*3+1]-pbuffer[((i+1)*m_size.cx+j+1)*3+1])
+abs(pbuffer[((i+1)*m_size.cx+j)*3+1]-pbuffer[(i*m_size.cx+j+1)*3+1]);
lpbits[(i*m_size.cx+j)*3+2]=abs(pbuffer[(i*m_size.cx+j)*3+2]-pbuffer[((i+1)*m_size.cx+j+1)*3+2])
+abs(pbuffer[((i+1)*m_size.cx+j)*3+2]-pbuffer[(i*m_size.cx+j+1)*3+2]);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::OnSobe()
{
// TODO: Add your command handler code here
//Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|
//+|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;
int i,j,*pbuffer;
pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
}
for(i=1;i<(m_size.cy-1);i++)
for(j=1;j<(m_size.cx-1);j++)
{
lpbits[(i*m_size.cx+j)*3]=abs(pbuffer[((i-1)*m_size.cx+j+1)*3]+2*pbuffer[(i*m_size.cx+j+1)*3]
+pbuffer[((i+1)*m_size.cx+j+1)*3]-pbuffer[((i-1)*m_size.cx+j-1)*3]
-2*pbuffer[(i*m_size.cx+j-1)*3]-pbuffer[((i+1)*m_size.cx+j-1)*3])
+abs(pbuffer[((i-1)*m_size.cx+j-1)*3]+2*pbuffer[((i-1)*m_size.cx+j)*3]
+pbuffer[((i-1)*m_size.cx+j+1)*3]-pbuffer[((i+1)*m_size.cx+j-1)*3]
-2*pbuffer[((i+1)*m_size.cx+j)*3]-pbuffer[((i+1)*m_size.cx+j+1)*3]);
lpbits[(i*m_size.cx+j)*3+1]=abs(pbuffer[((i-1)*m_size.cx+j+1)*3+1]+2*pbuffer[(i*m_size.cx+j+1)*3+1]
+pbuffer[((i+1)*m_size.cx+j+1)*3+1]-pbuffer[((i-1)*m_size.cx+j-1)*3+1]
-2*pbuffer[(i*m_size.cx+j-1)*3+1]-pbuffer[((i+1)*m_size.cx+j-1)*3+1])
+abs(pbuffer[((i-1)*m_size.cx+j-1)*3+1]+2*pbuffer[((i-1)*m_size.cx+j)*3+1]
+pbuffer[((i-1)*m_size.cx+j+1)*3+1]-pbuffer[((i+1)*m_size.cx+j-1)*3+1]
-2*pbuffer[((i+1)*m_size.cx+j)*3+1]-pbuffer[((i+1)*m_size.cx+j+1)*3+1]);
lpbits[(i*m_size.cx+j)*3+2]=abs(pbuffer[((i-1)*m_size.cx+j+1)*3+2]+2*pbuffer[(i*m_size.cx+j+1)*3+2]
+pbuffer[((i+1)*m_size.cx+j+1)*3+2]-pbuffer[((i-1)*m_size.cx+j-1)*3+2]
-2*pbuffer[(i*m_size.cx+j-1)*3+2]-pbuffer[((i+1)*m_size.cx+j-1)*3+2])
+abs(pbuffer[((i-1)*m_size.cx+j-1)*3+2]+2*pbuffer[((i-1)*m_size.cx+j)*3+2]
+pbuffer[((i-1)*m_size.cx+j+1)*3+2]-pbuffer[((i+1)*m_size.cx+j-1)*3+2]
-2*pbuffer[((i+1)*m_size.cx+j)*3+2]-pbuffer[((i+1)*m_size.cx+j+1)*3+2]);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::OnLaplace()
{
// TODO: Add your command handler code here
//拉普拉斯算子:G[I,j]=|f[i+1,j]+f[i-1,j]+f(i,j+1)+f[i,j-1]-4f[i,j]|;
int i,j,*pbuffer;
pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
}
for(i=1;i<(m_size.cy-1);i++)
for(j=1;j<(m_size.cx-1);j++)
{
lpbits[(i*m_size.cx+j)*3]=abs(pbuffer[((i+1)*m_size.cx+j)*3]+pbuffer[((i-1)*m_size.cx+j)*3]
+pbuffer[(i*m_size.cx+j+1)*3]+pbuffer[(i*m_size.cx+j-1)*3]
-4*pbuffer[(i*m_size.cx+j)*3]);
lpbits[(i*m_size.cx+j)*3+1]=abs(pbuffer[((i+1)*m_size.cx+j)*3+1]+pbuffer[((i-1)*m_size.cx+j)*3+1]
+pbuffer[(i*m_size.cx+j+1)*3+1]+pbuffer[(i*m_size.cx+j-1)*3+1]
-4*pbuffer[(i*m_size.cx+j)*3+1]);
lpbits[(i*m_size.cx+j)*3+2]=abs(pbuffer[((i+1)*m_size.cx+j)*3+2]+pbuffer[((i-1)*m_size.cx+j)*3+2]
+pbuffer[(i*m_size.cx+j+1)*3+2]+pbuffer[(i*m_size.cx+j-1)*3+2]
-4*pbuffer[(i*m_size.cx+j)*3+2]);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -