📄 dip.cpp
字号:
for ( i = 255 ; i > 125 ; i-- )
for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )
{
t = image[i][j];
if ( t <= 185 ) image[i][j] = 0;
else image[i][j] = (t-185)*2.5;
}
for ( i = 255 ; i > 125 ; i-- )
image[i][208]=(image[i][207]+image[i][209])/2;
for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )
image[125][j]=(image[124][j]+image[126][j])/2;
for ( i = 160 ; i > 123 ; i--)
for ( j = 207 ; j < bmpInfoHeader.biWidth ; j++ )
if ( image[i][j]>50 ) image[i][j]+=35;
for ( i = 254 ; i > 120 ; i-- )
for ( j = 200 ; j < bmpInfoHeader.biWidth-1 ; j++ )
{
t = 0;
for ( i1=-1; i1 <= 1; i1++ )
for ( i2 = -1; i2 <= 1; i2++ )
{
if ( t == 0 )
{
buf[t] = image[i+i1][j+i2];
t++;
}
else
{
i3 = t;
while ( i3 >= 0 && buf[i3] > image[i+i1][j+i2] )
{
buf[i3+1] = buf[i3];
i3--;
}
buf[i3+1] = image[i+i1][j+i2];
t++;
}
}
temp[i][j] = buf[4];
}
for ( i = 255 ; i > 120 ; i-- )
for ( j = 200 ; j < bmpInfoHeader.biWidth ; j++ )
image[i][j] = temp[i][j];
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMClear()
{
int i,j,t;
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 = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
temp[i][j] = image[i][j];
for ( i = 1 ; i < bmpInfoHeader.biHeight-1 ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth-1 ; j++ )
{
t = 9*temp[i][j] - ( temp[i-1][j-1] + temp[i-1][j]
+ temp[i-1][j+1] + temp[i][j-1] + temp[i][j+1]
+ temp[i+1][j-1] + temp[i+1][j] + temp[i+1][j+1] );
if ( t < 0 ) image[i][j] = 0;
else if ( t > 255 ) image[i][j] = 255;
else image[i][j] = t;
}
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CM3D_Transfer()
{
const float pi = 3.1415926;
int i,j;
int fai = 30,sita = 30;
long d = 100000,f = 100000;
float x0,y0,u,v;
float s1,s2,c1,c2,sc,cc,ss,cs,a11,a12,a21,a22,det;
DlgBuf * buffer = new DlgBuf();
PTSetDialog PSet = new TSetDialog(this,DIPDIALOG,buffer);
if ( GetApplication()->ExecDialog(PSet) == IDOK )
{
d = atol(buffer->s1);
sita = atoi(buffer->s2);
fai = atoi(buffer->s3);
}
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 ;
}
}
s1 = sin(fai*pi/180);
s2 = sin(sita*pi/180);
c1 = cos(fai*pi/180);
c2 = cos(sita*pi/180);
sc = s1*c2;
cc = c1*c2;
ss = s1*s2;
cs = c1*s2;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
temp[i][j] = image[i][j];
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
x0 = j - bmpInfoHeader.biWidth/2;
y0 = i - bmpInfoHeader.biHeight/2;
a22 = f*c1-x0*sc;
a12 = f*s1+y0*cc;
a21 = -f*ss+x0*sc;
a11 = f*cs+y0*cc;
det = a11*a22-a21*a12;
u = (a11*x0*d+a12*y0*d)/det;
v = (a21*x0*d+a22*y0*d)/det;
if ( u < -bmpInfoHeader.biHeight/2 || u >= 256-bmpInfoHeader.biHeight/2
|| v < -bmpInfoHeader.biWidth/2 || v >= 256-bmpInfoHeader.biWidth/2 )
image[i][j] = 0;
else image[i][j]
= temp[(int)(v+bmpInfoHeader.biWidth/2)][(int)(u+bmpInfoHeader.biHeight/2)];
}
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMEdge()
{
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] > 135 ) image[i][j] = 0xff;
else image[i][j] = 0;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
void TDipWindow::CMThin()
{
int i,j,flag,index,min,max;
int change1,change2,change3,change4;
unsigned char sum1[512],sum2[512],sum3[512];
unsigned char total1[512],total2[512],total3[512];
rd[0] = 0;
rd[1] = -1;
rd[2] = -1;
rd[3] = -1;
rd[4] = 0;
rd[5] = 1;
rd[6] = 1;
rd[7] = 1;
rd[8] = 0;
cd[0] = 1;
cd[1] = 1;
cd[2] = 0;
cd[3] = -1;
cd[4] = -1;
cd[5] = -1;
cd[6] = 0;
cd[7] = 1;
cd[8] = 1;
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 = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
if ( image[i][j] > 0x80 ) image[i][j] = 0;
else image[i][j] = 1;
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
sum1[j] = 0;
for ( i = 30 ; i < 94 ; i++ )
{
flag = 0;
flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )
&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );
if ( flag && image[i][j] == 1 ) sum1[j]++;
}
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
sum2[j] = 0;
for ( i = 94 ; i < 155 ; i++ )
{
flag = 0;
flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )
&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );
if ( flag && image[i][j] == 1 ) sum2[j]++;
}
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
sum3[j] = 0;
for ( i = 155 ; i < 231 ; i++ )
{
flag = 0;
flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )
&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );
if ( flag && image[i][j] == 1 ) sum3[j]++;
}
}
do
{
change1 = ThinLeft();
change2 = ThinRight();
change3 = ThinTop();
change4 = ThinBottom();
} while( change1 || change2 || change3 || change4 );
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
total1[j] = 0;
for ( i = 30 ; i < 94 ; i++ )
if ( image[i][j] == 1 ) total1[j]++;
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
total2[j] = 0;
for ( i = 94 ; i < 155 ; i++ )
if ( image[i][j] == 1 ) total2[j]++;
}
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
{
total3[j] = 0;
for ( i = 155 ; i < 231 ; i++ )
if ( image[i][j] == 1 ) total3[j]++;
}
for ( j = 40 ; j < 380 ; j++ )
if ( j % 5 < 3 ) image[30][j] = 1;
for ( j = 40 ; j < 400 ; j++ )
if ( j % 5 < 3 ) image[94][j] = 1;
for ( j = 40 ; j < 472 ; j++ )
if ( j % 5 < 3 ) image[155][j] = 1;
for ( j = 40 ; j < 472 ; j++ )
if ( j % 5 < 3 ) image[231][j] = 1;
for ( i = 30 ; i < 231 ; i++ )
if ( i % 5 < 3 ) image[i][40] = 1;
for ( i = 30 ; i < 94 ; i++ )
if ( i % 5 < 3 ) image[i][380] = 1;
for ( i = 94 ; i < 155 ; i++ )
if ( i % 5 < 3 ) image[i][400] = 1;
for ( i = 155 ; i < 231 ; i++ )
if ( i % 5 < 3 ) image[i][472] = 1;
flag = 0;
for ( j = 57 ; j < 372 ; j++ )
if ( flag == 0 )
{
if ( sum1[j] < 3 )
{
min = j;
flag = 1;
}
}
else
{
if ( sum1[j] > 2 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( total1[index] < 2 )
for ( i = 30 ; i < 94 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
flag = 0;
for ( j = 57 ; j < 390 ; j++ )
if ( flag == 0 )
{
if ( sum2[j] < 3 )
{
min = j;
flag = 1;
}
}
else
{
if ( sum2[j] > 2 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( total2[index] < 2 )
for ( i = 94 ; i < 155 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
flag = 0;
for ( j = 57 ; j < 466 ; j++ )
if ( flag == 0 )
{
if ( sum3[j] < 3 )
{
min = j;
flag = 1;
}
}
else
{
if ( sum3[j] > 4 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( total3[index] < 2 )
for ( i = 155 ; i < 231 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
flag = 0;
for ( j = 57 ; j < 372 ; j++ )
if ( flag == 0 )
{
if ( total1[j] < 1 )
{
min = j;
flag = 1;
}
}
else
{
if ( total1[j] > 0 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( sum1[index] > 4 )
for ( i = 30 ; i < 94 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
flag = 0;
for ( j = 57 ; j < 390 ; j++ )
if ( flag == 0 )
{
if ( total2[j] < 1 )
{
min = j;
flag = 1;
}
}
else
{
if ( total2[j] > 0 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( sum2[index] > 3 )
for ( i = 94 ; i < 155 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
flag = 0;
for ( j = 57 ; j < 466 ; j++ )
if ( flag == 0 )
{
if ( total3[j] < 1 )
{
min = j;
flag = 1;
}
}
else
{
if ( total3[j] > 0 )
{
max = j - 1;
flag = 0;
index = (min+max)/2;
if ( sum3[index] > 4 )
for ( i = 155 ; i < 231 ; i++ )
if ( i % 5 < 3 ) image[i][index] = 1;
}
}
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )
if ( image[i][j] == 0 ) image[i][j] = 0xff;
else image[i][j] = 0;
for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )
delete temp[i];
delete temp;
Show();
SetCursor(hSaveCursor);
ReleaseCapture();
return;
}
TSetDialog::TSetDialog(PTWindowsObject AParent,int ResourceID,
DlgBuf *buffer):TDialog(AParent,ResourceID)
{
TransferBuffer = (void *)buffer;
}
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
TDipApp DipApp("Simple Draw Tool",hInstance,
hPrevInstance,lpCmdLine,nCmdShow);
DipApp.Run();
return DipApp.Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -