📄 dip.cpp
字号:
#include "dip.h"
void TDipApp::InitMainWindow()
{
MainWindow = new TDipWindow(NULL,"Dip");
}
TDipWindow::TDipWindow(PTWindowsObject pwParent,
LPSTR lpszTitle):TWindow(pwParent,lpszTitle,NULL)
{
image = NULL;
AssignMenu("DIPMENU");
}
TDipWindow::~TDipWindow()
{
if ( !image )
{
for ( int i = 0 ; i < nH ; i++ )
delete image[i];
delete image;
}
}
void TDipWindow::SetupWindow()
{
TWindow::SetupWindow();
hHourCursor = LoadCursor(NULL,IDC_WAIT);
}
LPSTR TDipWindow::GetClassName()
{
return "DipMainWindow";
}
BOOL TDipWindow::CMOpen()
{
int i;
OPENFILENAME ofn;
char szDirName[256];
char szFile[256], szFileTitle[256];
UINT cbString;
char chReplace;
char szFilter[256];
GetSystemDirectory(szDirName, sizeof(szDirName));
szFile[0] = '\0';
HINSTANCE hinst = GetApplication()->hInstance;
if ((cbString=LoadString(hinst,IDS_FILTERSTRING,
szFilter,sizeof(szFilter))) == 0 )
return FALSE;
chReplace = szFilter[cbString-1];
for ( i = 0 ; szFilter[i] != '\0' ; i++ )
if ( szFilter[i] == chReplace ) szFilter[i] = '\0';
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = HWindow;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = szDirName;
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if ( !GetOpenFileName(&ofn) )
return FALSE;
FILE * fp = fopen(szFile,"rb");
if ( !fp )
{
MessageBox(HWindow,"The file is not exist","Receive Message",MB_OK);
return FALSE;
}
fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
fread(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
fread(Quad,sizeof(RGBQUAD),256,fp);
if ( image )
{
for ( int i = 0 ; i < nH ; i++ )
delete image[i];
delete image;
}
nW = bmpInfoHeader.biWidth;
nH = bmpInfoHeader.biHeight;
image =(unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];
if (!image)
{
fclose(fp);
MessageBox(HWindow,"Get A null point","Receive Message",MB_OK);
return FALSE;
}
for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0 ; i-- )
{
image[i] = new unsigned char[bmpInfoHeader.biWidth];
if (!image[i])
{
fclose(fp);
MessageBox(HWindow,"Get a null point","Receive Message",MB_OK);
return FALSE;
}
int count = fread(image[i],1,bmpInfoHeader.biWidth,fp);
if ( count < bmpInfoHeader.biWidth )
{
fclose(fp);
MessageBox(HWindow,"File read error","Receive Message",MB_OK);
return FALSE;
}
}
HDC hDC = GetDC( HWindow );
for ( int row = bmpInfoHeader.biHeight - 1 ; row >= 0 ; row-- )
for ( int col = bmpInfoHeader.biWidth - 1 ; col >= 0 ; col -- )
{
unsigned char gc = image[row][col];
SetPixel ( hDC,col,row,RGB(gc,gc,gc) );
}
ReleaseDC( HWindow, hDC );
fclose ( fp );
return TRUE;
}
void TDipWindow::CMSave()
{
int i;
OPENFILENAME ofn;
char szDirName[256];
char szFile[256], szFileTitle[256];
UINT cbString;
char chReplace;
char szFilter[256];
GetSystemDirectory(szDirName, sizeof(szDirName));
szFile[0] = '\0';
HINSTANCE hinst = GetApplication()->hInstance;
if ((cbString=LoadString(hinst,IDS_FILTERSTRING,
szFilter,sizeof(szFilter))) == 0 )
return;
chReplace = szFilter[cbString-1];
for ( i = 0 ; szFilter[i] != '\0' ; i++ )
if ( szFilter[i] == chReplace ) szFilter[i] = '\0';
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = HWindow;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = szDirName;
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if ( !GetSaveFileName(&ofn) )
return;
FILE * fp = fopen(szFile,"wb");
fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(Quad,sizeof(RGBQUAD),256,fp);
for ( i = nH-1 ; i >= 0 ; i-- )
fwrite(image[i],1,nW,fp);
fclose(fp);
}
void TDipWindow::Show()
{
HDC hDC = GetDC( HWindow );
SetCapture(HWindow);
hSaveCursor = SetCursor(hHourCursor);
for ( int row = bmpInfoHeader.biHeight - 1 ; row >= 0 ; row-- )
for ( int col = bmpInfoHeader.biWidth - 1 ; col >= 0 ; col -- )
{
unsigned char gc = image[row][col];
SetPixel ( hDC,col,row,RGB(gc,gc,gc) );
}
SetCursor(hSaveCursor);
ReleaseCapture();
ReleaseDC( HWindow, hDC );
}
void TDipWindow::WMSize(RTMessage Msg)
{
if ( !image ) Show();
}
void TDipWindow::GetNeighbour(int row,int col,unsigned char *p)
{
int m;
for ( m = 0; m < 8; m ++ )
p[m] = image[row+rd[m]][col+cd[m]];
}
int TDipWindow::ThinLeft(void)
{
unsigned char p[8];
int row, col, B4;
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
temp[row][col] = 0;
int change = 0;
for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )
for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )
{
if( image[row][col] == 1 )
{
GetNeighbour(row,col,p);
B4 = !p[4] && p[0] && ( p[1] || p[2] || p[6] || p[7] )
&& ( p[2] || !p[3] ) && ( !p[5] || p[6] );
if ( B4 ) change = 1;
else temp[row][col] = 1;
}
}
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
image[row][col] = temp[row][col];
return change;
}
int TDipWindow::ThinRight(void)
{
unsigned char p[8];
int row, col, B0;
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
temp[row][col] = 0;
int change = 0;
for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )
for ( col = bmpInfoHeader.biWidth-1 ; col > 0; col -- )
{
if( image[row][col] == 1 )
{
GetNeighbour(row, col, p);
B0 = !p[0] && p[4] && ( p[2] || p[3] || p[5] || p[6] )
&& ( p[6] || !p[7] ) && ( !p[1] || p[2] );
if ( B0 ) change = 1;
else temp[row][col] = 1;
}
}
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
image[row][col] = temp[row][col];
return change;
}
int TDipWindow::ThinTop(void)
{
unsigned char p[8];
int row, col, B2;
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
temp[row][col] = 0;
int change = 0;
for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )
for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )
{
if( image[row][col] == 1 )
{
GetNeighbour(row,col,p);
B2 = !p[2] && p[6] && ( p[0] || p[4] || p[5] || p[7] )
&& ( p[0] || !p[1] ) && ( !p[3] || p[4] );
if ( B2 ) change = 1;
else temp[row][col] = 1;
}
}
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
image[row][col] = temp[row][col];
return change;
}
int TDipWindow::ThinBottom(void)
{
unsigned char p[8];
int row, col, B6;
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
temp[row][col] = 0;
int change = 0;
for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )
for ( row = bmpInfoHeader.biHeight-1 ; row > 0; row -- )
{
if( image[row][col] == 1 )
{
GetNeighbour(row, col, p );
B6 = !p[6] && p[2] && ( p[0] || p[1] || p[3] || p[4] )
&& ( p[4] || !p[5] ) && ( !p[7] || p[0] );
if ( B6 ) change = 1;
else temp[row][col] = 1;
}
}
for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )
for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )
image[row][col] = temp[row][col];
return change;
}
void TDipWindow::Edge(void)
{
int i,j,max,t;
for ( i = 1 ; i < bmpInfoHeader.biHeight-1 ; i++ )
for ( j = 1 ; j < bmpInfoHeader.biWidth-1 ; j++ )
{
max = 0;
t = abs(image[i-1][j-1]+image[i-1][j]+image[i-1][j+1]
-image[i+1][j-1]-image[i+1][j]-image[i+1][j+1]);
if ( t > max ) max = t;
t = abs(image[i][j-1]+image[i-1][j-1]+image[i-1][j]
-image[i+1][j]-image[i+1][j+1]-image[i][j+1]);
if ( t > max ) max = t;
t = abs(image[i-1][j-1]+image[i][j-1]+image[i+1][j-1]
-image[i-1][j+1]-image[i][j+1]-image[i+1][j+1]);
if ( t > max ) max = t;
t = abs(image[i][j-1]+image[i+1][j-1]+image[i+1][j]
-image[i-1][j]-image[i-1][j+1]-image[i][j+1]);
if ( t > max ) max = t;
temp[i][j] = max;
}
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
{
temp[i][0] = 0;
temp[i][bmpInfoHeader.biWidth-1] = 0;
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
temp[0][j] = 0;
temp[bmpInfoHeader.biHeight-1][j] = 0;
}
return;
}
void TDipWindow::CMTower()
{
int i,j;
unsigned char total[256];
SetCapture(HWindow);
hSaveCursor = SetCursor(hHourCursor);
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
if ( image[i][j] < 195 && image[i][j] > 170 )
image[i][j] = 0xff;
else image[i][j] = 0;
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
total[j] = 0;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
if ( image[i][j] == 0xff ) total[j]++;
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
if ( total[j] < 40 )
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
image[i][j] = 0;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMBridge()
{
int i,j;
SetCapture(HWindow);
hSaveCursor = SetCursor(hHourCursor);
temp = (unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];
if (!temp)
{
MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);
SetCursor(hSaveCursor);
ReleaseCapture();
return ;
}
for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0 ; i-- )
{
temp[i] = new unsigned char[bmpInfoHeader.biWidth];
if (!temp[i])
{
MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);
SetCursor(hSaveCursor);
ReleaseCapture();
return ;
}
}
Edge();
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
if ( temp[i][j] > 45 ) image[i][j] = 0xff;
else image[i][j] = 0;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 163 ; j < bmpInfoHeader.biWidth ; j++ )
image[i][j] = 0;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMWord()
{
int i,j,t;
int scale1=25,scale2=20,scale;
SetCapture(HWindow);
hSaveCursor = SetCursor(hHourCursor);
for ( i = 252 ; i > 122 ; i-- )
for ( j = 1 ; j < bmpInfoHeader.biWidth - 1 ; j++ )
{
t=image[i][j];
if ( (j>198) && (j<269) ) scale = scale1;
else if ( (j>333) && (j<459) ) scale = scale1;
else scale = scale2;
if ( (t>75) && (t<155) )
{
t = image[2*129-i][j];
if ( t <= scale ) image[i][j] = 1;
else image[i][j] = t - scale;
}
}
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMMark()
{
int i,j,i1,i2,i3;
unsigned char t,buf[9];
SetCapture(HWindow);
hSaveCursor = SetCursor(hHourCursor);
temp = (unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];
if (!temp)
{
MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);
SetCursor(hSaveCursor);
ReleaseCapture();
return ;
}
for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0 ; i-- )
{
temp[i] = new unsigned char[bmpInfoHeader.biWidth];
if (!temp[i])
{
MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);
SetCursor(hSaveCursor);
ReleaseCapture();
return ;
}
}
for ( i = 255 ; i > 125 ; i-- )
for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )
{
t = image[i][j];
if ( t < 170 ) image[i][j] = 255;
}
for ( i = 255 ; i > 125 ; i-- )
for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )
{
if ( image[i][j] == 255 )
{
t = 0;
i3 = 0;
for ( i1 = -6 ; i1 < 0 ; i1++ )
for ( i2 = -5 ; i2 < 1 ; i2++ )
if ( image[i+i1][j+i2] < 255 )
{
t += image[i+i1][j+i2];
i3++;
}
t = t/i3;
temp[i][j] = t;
}
}
for ( i = 255 ; i > 125 ; i--)
for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )
if ( image[i][j] == 255 )
image[i][j] = temp[i][j];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -