?? imagepview.cpp
字號:
brBrush.CreatePatternBrush(&pBitmap);
pDC->SelectObject(&brBrush);
pDC->Rectangle(x,y,x+400,y+100);
brBrush.DeleteObject();
}
void CImagePView::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],lstrlen(textbuf[i]));
}
}
void CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::On256colorImageExam()
{
int i,j;
SaveCanvus.Create(512,512,8,0);
SetDefaultPalette(&SaveCanvus);
for (i=0;i<256;i++)
for (j=0;j<256;j++)
SetPixelValue(&SaveCanvus,j,i,j);
for (i=0;i<256;i++)
for (j=0;j<256;j++)
SetPixelValue(&SaveCanvus,256+j,i,j/16);
for (i=0;i<256;i++)
for (j=0;j<256;j++)
SetPixelValue(&SaveCanvus,j,256+i,(i/16)*16);
RectFillValue(&SaveCanvus,255,255,257,257,7);
for (i=0;i<16;i++)
for (j=0;j<16;j++)
RectFillValue(&SaveCanvus,256+j*16,256+i*16,15,15,i*16+j);
ImageCopy(pImg[1],pImg[0]);
m_FileName = "256 色模式圖像實例";
Invalidate();
}
void CImagePView::OnTrueColorImageExam()
{
int i,j,nBytesPerPixel;
BYTE buff[2048];
SaveCanvus.Create(512,512,24,0);
nBytesPerPixel = SaveCanvus.GetBPP()/8;
for (i=0;i<256;i++) {
for (j=0;j<3;j++) buff[i*nBytesPerPixel+j]=(BYTE) i;
}
for (i=0;i<256;i++)
SetRectValue(&SaveCanvus,0,0+i,256,1,buff);
for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;
for (i=0;i<256;i++) buff[i*nBytesPerPixel]=(BYTE) i;
for (i=0;i<256;i++)
SetRectValue(&SaveCanvus,256,i,256,1,buff);
for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;
for (i=0;i<256;i++) buff[i*nBytesPerPixel+1]=(BYTE) i;
for (i=0;i<256;i++)
SetRectValue(&SaveCanvus,0,256+i,256,1,buff);
for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;
for (i=0;i<256;i++) buff[i*nBytesPerPixel+2]=(BYTE) i;
for (i=0;i<256;i++)
SetRectValue(&SaveCanvus,256,256+i,256,1,buff);
ImageCopy(pImg[1],pImg[0]);
m_FileName = "真彩色模式圖像實例";
Invalidate();
}
void CImagePView::WorkCanvusToWindow()
{
CClientDC dc(this);
struct IMAGEPARAMENT P;
if (SaveCanvus.IsNull()) return;
GetImageParament(&WorkCanvus,&P);
WorkCanvus.BitBlt(dc,0,0,P.nWidth,P.nHeight,0,0,SRCCOPY);
}
void CImagePView::OnRefresh()
{
if (SaveCanvus.IsNull()) return;
OnClearWindow();
if (ImageType(pImg[0])<2)
LowTypeToIndex(pImg[1],pImg[0]);
else
ImageCopy(pImg[1],pImg[0]);
WriteTitle(pImg[1],m_FileName,"");
WorkCanvusToWindow();
m_nFlag=0;
m_nSize=1;
}
void CImagePView::WriteTitle(CImage* pImg,CString FileName,CString str0) // 顯示帶圖像文件名與分辨率的標題行
{
int i,k;
CString str, str1;
struct IMAGEPARAMENT P;
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath(FileName, drive, dir, fname, ext);
CWnd* pMain = AfxGetMainWnd();
CMenu* pMenu = pMain->GetMenu();
k=ImageType(pImg);
for (i=0;i<5;i++)
pMenu->CheckMenuItem(ID_BINARY_IMAGE+i,MF_UNCHECKED);
pMenu->CheckMenuItem(ID_BINARY_IMAGE+k,MF_CHECKED);
GetImageParament(pImg,&P);
if (k==0) P.nBitCount=1;
else if (k==1) P.nBitCount=4;
str1.Format(" (%d×%d×%d)", P.nWidth, P.nHeight, P.nBitCount);
str.LoadString(AFX_IDS_APP_TITLE);
AfxGetMainWnd()->SetWindowText(str+" - "+
fname + ext + str0 +str1);
}
void CImagePView::OnGrayPalette()
{
Invalidate();
for (int i=0;i<256;i++)
SetPalette(&WorkCanvus,i,i,i,i);
WorkCanvusToWindow();
}
void CImagePView::OnBluePalette()
{
Invalidate();
for (int i=0;i<256;i++)
SetPalette(&WorkCanvus,i,0,0,i);
WorkCanvusToWindow();
}
void CImagePView::OnRestorePalette()
{
int nNumColors;
RGBQUAD ColorTab[256];
Invalidate();
nNumColors=SaveCanvus.GetMaxColorTableEntries();
SaveCanvus.GetColorTable(0,nNumColors,ColorTab);
WorkCanvus.SetColorTable(0,nNumColors,ColorTab);
WorkCanvusToWindow();
}
void CImagePView::OnMovPalette()
{
OnRefresh();
SetTimer(ID_CLOCK_TIMER,100,NULL);
ShowCursor(FALSE);
m_nFlag=ID_MOV_PALETTE;
}
void CImagePView::OnImagePalette()
{
RGBQUAD ColorTab[256];
int nWidth,nNumColors;
OnRefresh();
nWidth =SaveCanvus.GetWidth();
nNumColors=SaveCanvus.GetMaxColorTableEntries();
SaveCanvus.GetColorTable(0,nNumColors,ColorTab);
DisplayPalette(ColorTab,nNumColors,nWidth+20,20,10,10);
}
void CImagePView::OnPasteRefresh()
{
WorkCanvusToWindow();
m_nFlag=0;
}
void CImagePView::OnConservationImage()
{
ImageCopy(pImg[0],pImg[1]);
}
void CImagePView::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 CImagePView::ClearWorkCanvus(void)
{
struct IMAGEPARAMENT P;
BYTE *buf;
GetImageParament(&WorkCanvus,&P);
buf = (BYTE*) WorkCanvus.GetPixelAddress(0,P.nHeight-1);
memset(buf,255,P.nSize);
}
void CImagePView::OnDrawRefresh()
{
Invalidate();
}
void CImagePView::OnClearWindow()
{
CClientDC dc(this);
dc.SelectStockObject(WHITE_PEN);
dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(0,0,1023,639);
}
void CImagePView::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;
}
WorkCanvusToWindow();
}
CWnd::OnTimer(nIDEvent);
}
void CImagePView::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 CImagePView::OnColorToGray()
{
CString str1;
if (ImageType(pImg[0])==2) return;
ColorToGray(pImg[0],pImg[0]);
ImageCopy(pImg[1],pImg[0]);
str1.Format(" 的灰階圖像");
WriteTitle(pImg[1],m_FileName,str1);
WorkCanvusToWindow();
m_nSize=1;
m_nFArea=0;
}
void CImagePView::OnImageInvert()
{
ImageInvert(pImg[1]);
WorkCanvusToWindow();
}
void CImagePView::OnColorToMonochrom()
{
ColorToMonochrom(pImg[1]);
WorkCanvusToWindow();
}
void CImagePView::OnFlipHorizon()
{
Flip(pImg[1],1);
WorkCanvusToWindow();
}
void CImagePView::OnFlipVert()
{
Flip(pImg[1],2);
WorkCanvusToWindow();
}
void CImagePView::OnRotate180()
{
Flip(pImg[1],3);
WorkCanvusToWindow();
}
void CImagePView::OnRotate270()
{
ImageCopy(pImg[2],pImg[1]);
Rotate90(pImg[1],pImg[2],1);
OnClearWindow();
WorkCanvusToWindow();
}
void CImagePView::OnRotate90()
{
ImageCopy(pImg[2],pImg[1]);
Rotate90(pImg[1],pImg[2],2);
OnClearWindow();
WorkCanvusToWindow();
}
void CImagePView::OnImageMasaic()
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -