📄 laplaciansketch.c
字号:
// Ex9
// Laplacian 素描
#include <windows.h>
#include "image32.h"
extern HDC hMemDC;
extern struct IMAGE *image;
extern struct IMAGE *Image[10];
void ColorToGray(int m,int n); // 变灰阶
int Mask[3][3],Scale=1,Offset=0;
void Template(BYTE **list1,BYTE **list0,int Dx,int Dy)
{
int i,j,g;
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
g = (Mask[0][0]*list1[i-1][j-1]+Mask[0][1]*list1[i-1][j]
+Mask[0][2]*list1[i-1][j+1]+Mask[1][0]*list1[i][j-1]
+Mask[1][1]*list1[i][j] +Mask[1][2]*list1[i][j+1]
+Mask[2][0]*list1[i+1][j-1]+Mask[2][1]*list1[i+1][j]
+Mask[2][2]*list1[i+1][j+1])/Scale+Offset;
if (g>0xff) g=0xff;
else if (g<0) g=0;
list0[i][j] = (BYTE) g;
}
}
}
void TemplateD(struct IMAGE *image,int x,int y,int Dx,int Dy)
{
BYTE *buf1,*buf0;
BYTE **list1,**list0;
int i;
buf1 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
buf0 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
getimage(image,x,y,Dx,Dy,buf1);
list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
for(i=0;i<Dy;i++) {
list1[i]=buf1+i*Dx;
list0[i]=buf0+i*Dx;
}
Template(list1,list0,Dx,Dy);
for(i=1;i<Dy-1;i++)
setimage(image,x+1,y+i,Dx-2,1,&list0[i][1]);
free(buf1);
free(buf0);
free(list1);
free(list0);
}
void LapSketchD8(struct IMAGE *image,int x,int y,int Dx,int Dy)
{
Scale=1; Offset=255;
Mask[0][0]=Mask[0][2]=Mask[2][0]=Mask[2][2]=-1;
Mask[0][1]=Mask[2][1]=Mask[1][0]=Mask[1][2]=-1;
Mask[1][1]=8;
TemplateD(image,x,y,Dx,Dy);
Offset=0;
}
void LaplacianSketch(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
LapSketchD8(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -