📄 showpixview.cpp
字号:
//建立临时数组
int *pix=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
//边缘检测
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
pix[i*p+j]= abs(m_pData[((i-1)*p)+j+1]+
2*m_pData[(i*p)+j+1]+
m_pData[((i+1)*p)+j+1]-
m_pData[((i-1)*p)+j-1]-
2*m_pData[(i*p)+j-1]-
m_pData[((i+1)*p)+j-1])
+
abs(m_pData[((i+1)*p)+j-1]+
2*m_pData[((i+1)*p)+j]+
m_pData[(i+1)*p+j+1]-
m_pData[((i-1)*p)+j-1]-
2*m_pData[((i-1)*p)+j]-
m_pData[((i-1)*p)+j+1]);
//灰度超过255按255来计,小于0按0来计
if( pix[i*p+j]>255)
pix[i*p+j]=255;
else
{
if( pix[i*p+j]<0)
pix[i*p+j]=0;
}
}
}
}
// 赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=pix[i*p+j];
}
free(pix);
Invalidate();
}
void CShowPixView::OnGaus()
{
// TODO: Add your command handler code here
m_flag=0;
int i,j;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
//建立临时数组
int *pix1=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1
||j==1||j==m_info->bmiHeader.biWidth-2||i==1||i==m_info->bmiHeader.biHeight-2)
{}
else
{
pix1[i*p+j]=(24*m_pData[i*p+j]+
8*m_pData[(i+1)*p+j]+
8*m_pData[(i-1)*p+j]+
8*m_pData[i*p+j+1]+
8*m_pData[i*p+j-1]-
4*m_pData[(i-2)*p+j+1]-
4*m_pData[(i-2)*p+j-1]-
4*m_pData[(i-2)*p+j]-
4*m_pData[(i+2)*p+j+1]-
4*m_pData[(i+2)*p+j-1]-
4*m_pData[(i+2)*p+j]-
4*m_pData[(i-1)*p+j-2]-
4*m_pData[(i-1)*p+j+2]-
4*m_pData[(i+1)*p+j-2]-
4*m_pData[(i+1)*p+j+2]-
4*m_pData[i*p+j-2]-
4*m_pData[i*p+j+2]-
2*m_pData[(i-2)*p+j-2]-
2*m_pData[(i-2)*p+j+2]-
2*m_pData[(i+2)*p+j-2]-
2*m_pData[(i+2)*p+j+2]);
//灰度超过255按255来计,小于0按0来计
if( pix1[i*p+j]>255)
pix1[i*p+j]=255;
else
{
if( pix1[i*p+j]<0)
pix1[i*p+j]=0;
}
}
}
}
//赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=pix1[i*p+j];
}
free(pix1);
Invalidate();
}
void CShowPixView::OnFileOpen()
{
//设置标志位
m_flag=0;
// TODO: Add your command handler code here
//打开文本对话框
CFileDialog bmp(true,"bmp",NULL,OFN_HIDEREADONLY,"Bitamp Files (*.bmp)|*.bmp|All files (*.*)|*.*||");
if(bmp.DoModal()==IDOK)
{
CString string=bmp.GetPathName();
//打开文件
CFile file;
file.Open(string,CFile::modeRead);
//读取位图文件头
BITMAPFILEHEADER header;
file.Read(&header,sizeof(BITMAPFILEHEADER));
//读取位图信息
if( m_info )
{
delete [] m_info;
m_info = NULL;
}
if( m_pData )
{
delete [] m_pData;
m_pData = NULL;
}
m_info=(PBITMAPINFO)new BYTE [40+256*4];
file.Read(m_info,40+256*4);
//位图大小
DWORD dwSizeOfImg = (m_info->bmiHeader.biWidth+3)/4*4*m_info->bmiHeader.biHeight;
//读取数据区
m_pData=new BYTE[dwSizeOfImg];
file.Read( m_pData, dwSizeOfImg );
//关闭文件
file.Close();
//更新视图
Invalidate();
}
}
void CShowPixView::OnMove()
{
// TODO: Add your command handler code here
int p=(m_info->bmiHeader.biWidth+3)/4*4;
CMoveDialog dlg;
int move[2]={0,0};
dlg.m_move1=move[0];
dlg.m_move2=move[1];
if(dlg.DoModal()==IDOK)
{
move[0]=dlg.m_move1;
move[1]=dlg.m_move2;
int i,j;
for( i=0; i<m_info->bmiHeader.biHeight; i++)
{
for( j=m_info->bmiHeader.biWidth-1; j>-1; j--)
{
if(j>=move[1] && i<(m_info->bmiHeader.biHeight-move[0]))
{
m_pData[i*p+j]=m_pData[(i+move[0])*p+(j-move[1])];
}
}
}
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j =0; j <m_info->bmiHeader.biWidth; j=j+1 )
{
if (i>=(m_info->bmiHeader.biHeight-move[0])||j<move[1])
{
m_pData[i*p+j]=255;
}
}
}
Invalidate();
}
}
void CShowPixView::OnXmirro()
{
// TODO: Add your command handler code here
m_flag=0;
int i,j;
int temp=0;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j =0; j < m_info->bmiHeader.biWidth/2; j=j+1 )
{
temp=m_pData[i*p+(m_info->bmiHeader.biWidth-j-1)];
m_pData[i*p+(m_info->bmiHeader.biWidth-j-1)]=m_pData[i*p+j];
m_pData[i*p+j]=temp;
}
}
Invalidate();
}
void CShowPixView::OnYmirro()
{
// TODO: Add your command handler code here
m_flag=0;
int i,j;
int temp=0;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
for( i = 0; i < m_info->bmiHeader.biWidth; i=i+1 )
{
for( j =0; j < (m_info->bmiHeader.biHeight)/2; j=j+1 )
{
temp=m_pData[(m_info->bmiHeader.biHeight-j-1)*p+i];
m_pData[(m_info->bmiHeader.biHeight-j-1)*p+i]=m_pData[j*p+i];
m_pData[j*p+i]=temp;
}
}
Invalidate();
}
void CShowPixView::OnTranspose()
{
// TODO: Add your command handler code here
m_flag=0;
int i,j;
int nHeight = m_info->bmiHeader.biWidth;
int nWidth = m_info->bmiHeader.biHeight;
int nPixNew=(nWidth+3)/4*4;
int nPixOld=(nHeight+3)/4*4;
//建立临时数组
BYTE *pDataNew = new BYTE[nPixNew*nHeight];
for( i = 0; i <nHeight; i=i+1 )
{
for( j =0; j <nWidth; j=j+1 )
{
pDataNew[(nHeight-1-i)*nPixNew+j]=
m_pData[(nWidth-1-j)*nPixOld+i];
}
}
if(m_pData)
{
delete[] m_pData;
m_pData=NULL;
}
m_pData=pDataNew;
m_info->bmiHeader.biWidth = nWidth;
m_info->bmiHeader.biHeight = nHeight;
Invalidate();
}
void CShowPixView::OnStretch()
{
// TODO: Add your command handler code here
m_flag=0;
int i,j;
float stretch[3]={0.0,0.0,0.0};
CStretchDialog dlg;
dlg.m_stretch1=stretch[1];
dlg.m_stretch2=stretch[2];
if(dlg.DoModal()==IDOK)
{
stretch[1]=dlg.m_stretch1;
stretch[2]=dlg.m_stretch2;
int Hnew = int(m_info->bmiHeader.biHeight*stretch[2]+0.5);
int Wnew = int(m_info->bmiHeader.biWidth*stretch[1]+0.5);
int Wnew1=(Wnew+3)/4*4;
int Wold=(m_info->bmiHeader.biWidth+3)/4*4;
BYTE *pDataNew =new BYTE[Wnew1*Hnew];
for( i = 0; i <Hnew; i=i+1 )
{
for( j =0; j <Wnew1; j=j+1 )
{
int m=i/stretch[2];
int n=j/stretch[1];
if(m>0 &&m<m_info->bmiHeader.biHeight && n>0 && n<m_info->bmiHeader.biWidth)
{
pDataNew[ i*Wnew1+j]=m_pData[m*Wold+n];
}
}
}
if(m_pData)
{
delete[] m_pData;
m_pData=NULL;
}
m_pData=pDataNew;
m_info->bmiHeader.biWidth = Wnew;
m_info->bmiHeader.biHeight =Hnew;
Invalidate();
}
}
void CShowPixView::OnRotate()
{
// TODO: Add your command handler code here
m_flag=0;
double pi=3.14159265;
int i,j,i0,j0;
// 旋转角度
int rotate;
// 旋转角度的正弦和余弦
float Sina, Cosa;
// 源图四个角的坐标(以图像中心为坐标系原点)
float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;
// 旋转后四个角的坐标(以图像中心为坐标系原点)
float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;
// 两个中间常量
float f1,f2;
CRotateDialog dlg;
dlg.m_rotate=0.0;
if (dlg.DoModal() == IDOK)
{
rotate=dlg.m_rotate;
double rotate1=rotate*pi/180;
// 计算旋转角度的正弦
Sina = (float) sin((double)rotate1);
// 计算旋转角度的余弦
Cosa = (float) cos((double)rotate1);
int Width=m_info->bmiHeader.biWidth;
int Height=m_info->bmiHeader.biHeight;
// 计算原图的四个角的坐标(以图像中心为坐标系原点)
SrcX1 = (float) (- (Width ) / 2);
SrcY1 = (float) ( (Height ) / 2);
SrcX2 = (float) ( (Width ) / 2);
SrcY2 = (float) ( (Height ) / 2);
SrcX3 = (float) (- (Width ) / 2);
SrcY3 = (float) (- (Height) / 2);
SrcX4 = (float) ( (Width ) / 2);
SrcY4 = (float) (- (Height) / 2);
// 计算新图四个角的坐标(以图像中心为坐标系原点)
DstX1 = Cosa * SrcX1 + Sina * SrcY1;
DstY1 = -Sina * SrcX1 + Cosa * SrcY1;
DstX2 = Cosa * SrcX2 + Sina * SrcY2;
DstY2 = -Sina * SrcX2 + Cosa * SrcY2;
DstX3 = Cosa * SrcX3 + Sina * SrcY3;
DstY3 = -Sina * SrcX3 + Cosa * SrcY3;
DstX4 = Cosa * SrcX4 + Sina * SrcY4;
DstY4 = -Sina * SrcX4 + Cosa * SrcY4;
// 计算旋转后的图像实际宽度
int NewWidth = ( int) ( max( abs(DstX4 - DstX1), abs(DstX3 -DstX2) ) +0.5);
// 计算旋转后的图像高度
int NewHeight = ( int) ( max( abs(DstY4 - DstY1), abs(DstY3 - DstY2) )+ 0.5);
// 两个常数
f1 = (float) (-0.5 * NewWidth * Cosa - 0.5 * NewHeight * Sina
+ 0.5 * Width );
f2 = (float) ( 0.5 * NewWidth * Sina - 0.5 * NewHeight * Cosa
+ 0.5 * Height );
BYTE *pDataNew =new BYTE[(NewWidth+3)/4*4*NewHeight];
// 针对图像每行进行操作
for(i = 0; i < NewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < NewWidth; j++)
{
// 计算该象素在原图象中的坐标
i0 = (int) (-((float) j) * Sina + ((float) i) * Cosa + f2 );
j0 = (int) ( ((float) j) * Cosa + ((float) i) * Sina + f1 );
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < Width) && (i0 >= 0) && (i0 < Height))
{
pDataNew[ (NewHeight-1-i)*((NewWidth+3)/4*4)+j]=m_pData[(Height-1-i0)*((Width+3)/4*4)+j0];
}
else
{
// 对于源图中没有的象素,直接赋值为255
pDataNew[ (NewHeight-1-i)*((NewWidth+3)/4*4)+j]=255;
}
}
}
if(m_pData)
{
delete[] m_pData;
m_pData=NULL;
}
m_pData=pDataNew;
m_info->bmiHeader.biWidth = NewWidth;
m_info->bmiHeader.biHeight=NewHeight;
Invalidate();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -