📄 iprocesspview.cpp
字号:
void CIProcessPView::OnPasteRefresh()
{
WorkCanvusToWindow();
}
void CIProcessPView::OnConservationImage()
{
ImageCopy(pImg[0],pImg[1]);
}
void CIProcessPView::OnCloseImage()
{
CString str;
CWnd* pMain = AfxGetMainWnd();
CMenu* pMenu = pMain->GetMenu();
str.LoadString(AFX_IDS_APP_TITLE);
AfxGetMainWnd()->SetWindowText(str);
for (int i=0;i<5;i++)
pMenu->CheckMenuItem(ID_BINARY_IMAGE+i,MF_UNCHECKED);
SaveCanvus.Destroy();
WorkCanvus.Destroy();
OnSelectWindow();
OnClearWindow();
}
void CIProcessPView::ClearWorkCanvus(void)
{
struct IMAGEPARAMENT P;
BYTE *buf;
GetImageParament(&WorkCanvus,&P);
buf = (BYTE*) WorkCanvus.GetPixelAddress(0,P.nHeight-1);
memset(buf,255,P.nSize);
}
void CIProcessPView::OnDrawRefresh()
{
Invalidate();
}
void CIProcessPView::OnClearWindow()
{
CClientDC dc(this);
dc.SelectStockObject(WHITE_PEN);
dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(0,0,1023,639);
}
void CIProcessPView::OnSelectWindow()
{
int i;
CWnd* pMain = AfxGetMainWnd();
CMenu* pMenu = pMain->GetMenu();
m_nGraphicFlag=0;
for (i=0;i<2;i++)
pMenu->CheckMenuItem(ID_SELECT_WINDOW+i,MF_UNCHECKED);
pMenu->CheckMenuItem(ID_SELECT_WINDOW+m_nGraphicFlag,MF_CHECKED);
}
void CIProcessPView::OnSelectImage()
{
int i;
CWnd* pMain = AfxGetMainWnd();
CMenu* pMenu = pMain->GetMenu();
m_nGraphicFlag=1;
for (i=0;i<2;i++)
pMenu->CheckMenuItem(ID_SELECT_WINDOW+i,MF_UNCHECKED);
pMenu->CheckMenuItem(ID_SELECT_WINDOW+m_nGraphicFlag,MF_CHECKED);
}
void DrawPixelOnCanvus(CDC *pDC,int x1,int y1)
{
for(int y=y1;y<130+y1;y++)
for(int x=x1;x<1022;x++)
pDC->SetPixel(x,y,(COLORREF)x*y);
}
void CIProcessPView::OnDrawPixel()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawPixelOnCanvus(pDC,2,26);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawPixelOnCanvus(pWorkImgDC,0,0);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawLineOnCanvus(CDC *pDC,int x,int y)
{
COLORREF rgbPen=RGB(0,255,0);
CPen penGreen(PS_SOLID,2,rgbPen),
penBlack(PS_SOLID,2,RGB(0,255,255)),
*pOldPen=NULL;
int i,j,n;
n=400;
pOldPen=pDC->SelectObject(&penGreen);
pDC->MoveTo(x,y);
for (i=0;i<n;i++) {
j=(int) (50.0*(n-3*i/4)/n*sin(PI*i/(n/15)));
pDC->LineTo(x+i,y-j);
}
pDC->SelectObject(&penBlack);
pDC->MoveTo(x-20,y);
pDC->LineTo(x+n+20,y);
pDC->SelectObject(pOldPen);
penGreen.DeleteObject();
penBlack.DeleteObject();
}
void CIProcessPView::OnDrawLine()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawLineOnCanvus(pDC,2+56,26+65);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawLineOnCanvus(pWorkImgDC,56,65);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawGraphFillOnCanvus(CDC *pDC,int x1,int y1)
{
int x,y;
x=35+x1; y=130+y1;
pDC->SelectStockObject(BLACK_PEN);
pDC->SelectStockObject(HOLLOW_BRUSH);
pDC->Rectangle(x,y+50,x+50,y+100);
pDC->RoundRect(x,y+150,x+50,y+200,15,15);
pDC->Ellipse(x+75,y+50,x+125,y+100);
pDC->Chord(x+75,y+150,x+125,y+200,x+75,y+150,x+125,y+200);
pDC->Pie(x+150,y+50,x+200,y+100,x+150,y+50,x+200,y+50);
x=280+x1;
pDC->SelectStockObject(DKGRAY_BRUSH);
pDC->Rectangle(x,y+50,x+50,y+100);
pDC->RoundRect(x,y+150,x+50,y+200,15,15);
pDC->Ellipse(x+75,y+50,x+125,y+100);
pDC->Chord(x+75,y+150,x+125,y+200,x+75,y+150,x+125,y+200);
pDC->Pie(x+150,y+50,x+200,y+100,x+150,y+50,x+200,y+50);
}
void CIProcessPView::OnGraphFill()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawGraphFillOnCanvus(pDC,2,26);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawGraphFillOnCanvus(pWorkImgDC,0,0);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawHatchFillOnCanvus(CDC *pDC,int x,int y)
{
CBrush brBrush[6];
int i,k;
pDC->SetBkMode(OPAQUE);
pDC->SelectStockObject(BLACK_PEN);
brBrush[0].CreateHatchBrush(HS_HORIZONTAL,RGB(0,0,0));
brBrush[1].CreateHatchBrush(HS_VERTICAL,RGB(255,0,0));
brBrush[2].CreateHatchBrush(HS_CROSS,RGB(255,0,255));
brBrush[3].CreateHatchBrush(HS_FDIAGONAL,RGB(0,255,0));
brBrush[4].CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,255));
brBrush[5].CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,255));
k=75;
for (i=0;i<6;i++) {
pDC->SelectObject(&brBrush[i]);
pDC->Rectangle(x+k*i+10,y+10,x+k*(i+1),y+200);
brBrush[0].DeleteObject();
}
}
void CIProcessPView::OnHatchFill()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawHatchFillOnCanvus(pDC,550,175);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawHatchFillOnCanvus(pWorkImgDC,25,70);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawPatternFillOnCanvus(CDC *pDC,int x,int y)
{
CBrush brBrush;
CBitmap pBitmap;
short lpBits[8]={0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};
pBitmap.CreateBitmap(8,8,1,1,lpBits);
brBrush.CreatePatternBrush(&pBitmap);
pDC->SelectObject(&brBrush);
pDC->Rectangle(x,y,x+400,y+100);
brBrush.DeleteObject();
}
void CIProcessPView::OnPatternFill()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawPatternFillOnCanvus(pDC,56,400);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawPatternFillOnCanvus(pWorkImgDC,56,120);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawTextOnCanvus(CDC *pDC,int x,int y)
{
int i,nYChar;
TEXTMETRIC tm;
char *textbuf[]={"Windows C 图像处理演示程序",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"abcdefghijklmnopqrstuvwxyz",
"1234567890",
"Windows 图形编程"};
pDC->SetBkMode(TRANSPARENT);
pDC->GetTextMetrics(&tm);
nYChar=tm.tmHeight+tm.tmExternalLeading;
for (i=0;i<5;i++) {
pDC->TextOut(x,y+nYChar*i,textbuf[i]);
}
}
void CIProcessPView::OnDrawText()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawTextOnCanvus(pDC,2+90,26+520);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawTextOnCanvus(pWorkImgDC,90,370);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void DrawRandCircleOnCanvus(CDC *pDC,int xx,int yy)
{
CPen penPen, *pOldPen=NULL;
CRect Rect;
int x,y,r,x1,y1,x2,y2;
int cr,cg,cb,i,nWidth,nHeight;
pDC->GetClipBox(&Rect);
nWidth=Rect.Width()-2*xx;
nHeight=Rect.Height()-2*yy;
for (i=0;i<75;i++) {
x=rand()%(nWidth);
y=rand()%(nHeight);
r=rand()%((nWidth+nHeight)/25);
if (x<r) x+=r;
if (x>nWidth-r) x-=r;
if (y<r) y+=r;
if (y>nHeight-r) y-=r;
cr=rand()%256; cg=rand()%256;
cb=rand()%256;
x+=xx;
y+=yy;
x1=x-r; y1=y-r;
x2=x+r; y2=y+r;
penPen.CreatePen(PS_SOLID,1,RGB(cr,cg,cb));
pOldPen = pDC->SelectObject(&penPen);
pDC->Arc(x1,y1,x2,y2,x1,0,x1,0);
pDC->SelectObject(pOldPen);
penPen.DeleteObject();
}
}
void CIProcessPView::OnRandCircle()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
DrawRandCircleOnCanvus(pDC,2,26);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
DrawRandCircleOnCanvus(pWorkImgDC,0,0);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void CopyBitmapOnCanvus(CDC *pDC,int xx,int yy)
{
CRect Rect;
int Dx,Dy;
pDC->GetClipBox(&Rect);
Dx=Rect.Width();
Dy=Rect.Height();
pDC->SelectStockObject(BLACK_PEN);
pDC->SelectStockObject(HOLLOW_BRUSH);
if (SaveCanvus.IsNull()) {
pDC->BitBlt(xx+Dx/2,yy+Dy-Dy/3,
Dx/2,Dy/4,pDC,xx,yy,SRCCOPY);
pDC->Rectangle(xx,yy,xx+Dx/2,yy+Dy/4);
}
else {
CDC *pOrigDC= CDC::FromHandle(SaveCanvus.GetDC());
pDC->BitBlt(xx+Dx/2,yy+2*Dy/3,
Dx/2,Dy/4,pOrigDC,0,0,SRCCOPY);
SaveCanvus.ReleaseDC();
}
pDC->Rectangle(xx+Dx/2,yy+2*Dy/3,xx+Dx,yy+Dy-Dy/12);
}
void CIProcessPView::OnCopyBitmap()
{
m_nFlag=0;
if (m_nGraphicFlag==0) {
CWnd* pMain = AfxGetMainWnd();
CDC* pDC = pMain->GetDC();
CopyBitmapOnCanvus(pDC,2,26);
pMain->ReleaseDC(pDC);
}
else {
CDC *pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
CopyBitmapOnCanvus(pWorkImgDC,0,0);
WorkCanvus.ReleaseDC();
WorkCanvusToWindow();
}
}
void CIProcessPView::OnTimer(UINT nIDEvent)
{
if (m_nFlag==ID_MOV_PALETTE)
{
struct IMAGEPARAMENT P;
static RGBQUAD ColorTab;
CClientDC dc(this);
static int i=0;
GetImageParament(&WorkCanvus,&P);
if (i>0) {
WorkCanvus.SetColorTable(i-1,1,&ColorTab);
}
if (i<P.nNumColors) {
WorkCanvus.GetColorTable(i,1,&ColorTab);
SetPalette(&WorkCanvus,i,255,0,0);
}
i++;
if (i==P.nNumColors+1) {
KillTimer(ID_CLOCK_TIMER);
ShowCursor(TRUE);
i=0;
}
WorkCanvus.BitBlt(dc,0,0,P.nWidth,P.nHeight,0,0,SRCCOPY);
}
CWnd::OnTimer(nIDEvent);
}
void CIProcessPView::OnImageParament()
{
CClientDC dc(this);
int i,x,y,k,nYChar;
CString str;
TEXTMETRIC tm;
char *textbuf[]={"像素行的存储顺序","图像宽度","图像高度",
"每像素位数","每行字节数" };
m_nFlag=0;
OnRefresh();
x=625; y=120;
dc.SelectStockObject(WHITE_PEN);
dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(600,0,1023,624);
dc.SetBkMode(TRANSPARENT);
dc.GetTextMetrics(&tm);
dc.SetTextColor(RGB(0,0,0));
nYChar=(tm.tmHeight+tm.tmExternalLeading)*3/2;
dc.TextOut(x+60,y-nYChar*3/2,"图像特征参数");
for (i=0;i<5;i++) {
dc.TextOut(x,y+nYChar*i,textbuf[i]);
}
x += 175;
k = SaveCanvus.GetPitch();
if (k<0)
dc.TextOut(x,y+nYChar*0,"自下而上");
else
dc.TextOut(x,y+nYChar*0,"自上而下");
str.Format("%d ",abs(k));
dc.TextOut(x,y+nYChar*4,str);
str.Format("%d ",SaveCanvus.GetWidth());
dc.TextOut(x,y+nYChar*1,str);
str.Format("%d ",SaveCanvus.GetHeight());
dc.TextOut(x,y+nYChar*2,str);
str.Format("%d ",SaveCanvus.GetBPP());
dc.TextOut(x,y+nYChar*3,str);
if (SaveCanvus.GetMaxColorTableEntries()) {
dc.TextOut(x-175,y+nYChar*6,"使用色彩数");
k=SaveCanvus.GetMaxColorTableEntries();
str.Format("%d ",k);
dc.TextOut(x,y+nYChar*6,str);
}
else
dc.TextOut(x-175,y+nYChar*6,"真彩色图像,无调色板");
if (SaveCanvus.IsTransparencySupported()) {
dc.TextOut(x-175,y+nYChar*8,"调色板中透明色位置");
k=SaveCanvus.GetTransparentColor();
str.Format("%d ",k);
dc.TextOut(x,y+nYChar*8,str);
}
else
dc.TextOut(x-175,y+nYChar*8,"不支持透明位图");
}
//------------------------------------------------------------------------------------------
void CIProcessPView::OnGrayImage()
{
CString str1;
if (ImageType(pImg[0])==2) return;
ColorToGray(pImg[1],pImg[1]);
str1.Format(" 的灰阶图像");
WriteTitle(pImg[1],m_FileName,str1);
WorkCanvusToWindow();
m_nSize=1;
}
void CIProcessPView::OnImageInvert()
{
ImageInvert(pImg[1]);
WorkCanvusToWindow();
}
void CIProcessPView::OnColorToMonochrom()
{
ColorToMonochrom(pImg[1]);
WorkCanvusToWindow();
}
void CIProcessPView::FlipCV(int n)
{
Flip(pImg[1],n);
WorkCanvusToWindow();
}
void CIProcessPView::OnFlipHorizon()
{
FlipCV(1);
}
void CIProcessPView::OnFlipVert()
{
FlipCV(2);
}
void CIProcessPView::OnRotate180()
{
FlipCV(3);
}
void CIProcessPView::Rotate90CV(int n)
{
ImageCopy(pImg[2],pImg[1]);
Rotate90(pImg[1],pImg[2],n);
OnClearWindow();
WorkCanvusToWindow();
}
void CIProcessPView::OnRotate270()
{
Rotate90CV(1);
}
void CIProcessPView::OnRotate90()
{
Rotate90CV(2);
}
void CIProcessPView::OnImageMasaic()
{
ImageMasaic(pImg[1],4);
OnClearWindow();
WorkCanvusToWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -