📄 winimage.c
字号:
setimage(image,i ,0,1,hei,buff2);
setimage(image,wid-1-i,0,1,hei,buff1);
}
}
if ((n&0x2)==2) {
for (i=0;i<hei/2;i++) {
getimage(image,0,i ,wid,1,buff1);
getimage(image,0,hei-1-i,wid,1,buff2);
setimage(image,0,i ,wid,1,buff2);
setimage(image,0,hei-1-i,wid,1,buff1);
}
}
free(buff1);
free(buff2);
WriteDDB(image,0,0,0,0,wid,hei);
InvalidateRect(hwnd,NULL,FALSE);
}
void ImageBrowse(int x,int y) // 鼠标漫游与移动
{
int f=0;
if ((175<x)&&(x<195)&&(wid-pic_x>195)) {
pic_x+=3; f=1;
}
else if ((x<20)&&(wid>198)&&(wid-pic_x>0)) {
pic_x-=3; f=1;
}
if ((260<y)&&(y<280)&&(hei-pic_y>280)) {
pic_y+=3; f=1;
}
else if ((y<20)&&(hei>283)&&(hei-pic_y>0)) {
pic_y-=3; f=1;
}
if (pic_x+195>wid) pic_x=wid-195;
if (pic_x<0) pic_x=0;
if (pic_y+280>hei) pic_y=hei-280;
if (pic_y<0) pic_y=0;
if (f==1) {
WriteDDB(Image[0], 0, 0,pic_x,pic_y,195,270);
WriteDDB(Image[1],200, 0,pic_x,pic_y,195,270);
WriteDDB(Image[2],400, 0,pic_x,pic_y,195,270);
WriteDDB(Image[3],600, 0,pic_x,pic_y,195,270);
WriteDDB(Image[4], 0,275,pic_x,pic_y,195,270);
WriteDDB(Image[5],200,275,pic_x,pic_y,195,270);
WriteDDB(Image[6],400,275,pic_x,pic_y,195,270);
WriteDDB(Image[7],600,275,pic_x,pic_y,195,270);
}
InvalidateRect(hwnd,NULL,FALSE);
}
void ColorToGray(int m,int n) // 变灰阶
{
BYTE *buff,*p,gray[256];
int i,j,k,r,g,b;
if (Image[m]->hdib==NULL) return;
ImageCreate(Image[n],wid,hei,8);
buff=(BYTE*) malloc(Image[m]->bpl);
for (i=0;i<256;i++) {
setpalette(Image[n],i,i,i,i);
}
if (Image[m]->bitcount==8) {
for (i=0;i<256;i++) {
getpalette(Image[m],i,&r,&g,&b);
gray[i]=(BYTE) ((30*r+59*g+11*b+50)/100);
}
for (i=0;i<hei;i++) {
getimage(Image[m],0,i,wid,1,buff);
for (j=0;j<wid;j++) {
buff[j]=gray[buff[j]];
}
setimage(Image[n],0,i,wid,1,buff);
}
}
else if (Image[m]->bitcount==24) {
p=buff;
for (i=0;i<hei;i++) {
getimage(Image[m],0,i,wid,1,buff);
for (j=0,k=0;j<wid;j++,k+=3) {
buff[j]=(BYTE) ((11*p[k]+59*p[k+1]+30*p[k+2]+50)/100);
}
setimage(Image[n],0,i,wid,1,buff);
}
}
free(buff);
}
void MultiPictureDisp(void)
{
BYTE *buff,*buff1,pal[768];
int i,j,k,r,g,b;
if (Image[0]->hdib==NULL) return;
ImageCreate(Image[1],wid,hei,8);
ImageCreate(Image[2],wid,hei,8);
ImageCreate(Image[3],wid,hei,8);
buff=(BYTE*) malloc(image->bpl);
buff1=(BYTE*) malloc(image->bpl);
if (image->bitcount==24) {
for (i=0;i<hei;i++) {
getimage(image,0,i,wid,1,buff);
for (j=0,k=0;j<wid;j++,k+=3) buff1[j]=buff[k+2];
setimage(Image[1],0,i,wid,1,buff1);
for (j=0,k=0;j<wid;j++,k+=3) buff1[j]=buff[k+1];
setimage(Image[2],0,i,wid,1,buff1);
for (j=0,k=0;j<wid;j++,k+=3) buff1[j]=buff[k];
setimage(Image[3],0,i,wid,1,buff1);
}
}
else if (image->bitcount==8) {
for (i=0,j=0;i<256;i++) {
getpalette(image,i,&r,&g,&b);
pal[j++]=(BYTE) r;
pal[j++]=(BYTE) g;
pal[j++]=(BYTE) b;
}
for (i=0;i<hei;i++) {
getimage(image,0,i,wid,1,buff);
for (j=0;j<wid;j++) buff1[j]=pal[3*buff[j]];
setimage(Image[1],0,i,wid,1,buff1);
for (j=0;j<wid;j++) buff1[j]=pal[3*buff[j]+1];
setimage(Image[2],0,i,wid,1,buff1);
for (j=0;j<wid;j++) buff1[j]=pal[3*buff[j]+2];
setimage(Image[3],0,i,wid,1,buff1);
}
}
free(buff);
free(buff1);
for (i=0;i<256;i++) {
setpalette(Image[1],i,i,0,0);
setpalette(Image[2],i,0,i,0);
setpalette(Image[3],i,0,0,i);
}
ClearDDB();
WriteDDB(Image[0], 0,0,0,0,195,270);
WriteDDB(Image[1],200,0,0,0,195,270);
WriteDDB(Image[2],400,0,0,0,195,270);
WriteDDB(Image[3],600,0,0,0,195,270);
ColorToGray(0,4);
ImageCopy(1,5);
ImageCopy(2,6);
ImageCopy(3,7);
for (i=0;i<256;i++) {
setpalette(Image[5],i,i,i,i);
setpalette(Image[6],i,i,i,i);
setpalette(Image[7],i,i,i,i);
}
WriteDDB(Image[4], 0,275,0,0,195,270);
WriteDDB(Image[5],200,275,0,0,195,270);
WriteDDB(Image[6],400,275,0,0,195,270);
WriteDDB(Image[7],600,275,0,0,195,270);
hMemDC=CreateMemDC();
TextOut(hMemDC, 10, 10,"彩色图像",8);
TextOut(hMemDC,210, 10,"红分量(彩色)",12);
TextOut(hMemDC,410, 10,"绿分量(彩色)",12);
TextOut(hMemDC,610, 10,"蓝分量(彩色)",12);
TextOut(hMemDC, 10,285,"灰阶图像",8);
TextOut(hMemDC,210,285,"红分量(灰阶)",12);
TextOut(hMemDC,410,285,"绿分量(灰阶)",12);
TextOut(hMemDC,610,285,"蓝分量(灰阶)",12);
DeleteMemDC(hMemDC);
InvalidateRect(hwnd,NULL,FALSE);
}
int LButtonDown(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
int k,r,g,b,cur_x,cur_y,xs;
char StringT[20];
DWORD color;
COLORREF clrref;
if (image->hdib==NULL) return 0;
cur_x=LOWORD(lParam); cur_y=HIWORD(lParam);
if (T_flag!=IDM_WINCAPT) {
if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
return 0;
}
if (T_flag==IDM_POINT) { // 单点数据处理
xs=850;
color=getpixel(Image[0],cur_x,cur_y);
if (Image[0]->bitcount==8) {
getpalette(Image[0],(int)color,&r,&g,&b);
clrref=RGB(r,g,b);
}
else {
clrref=DWORD2CLRREF(color);
r=(color>>16)&0xff; g=(color>>8)&0xff;
b=color&0xff;
}
FillDdbWin(xs,45,60,60,RGB(0,0,0),clrref);
FillDdbWin(xs,120,80,180,RGB(255,255,255),RGB(255,255,255));
hMemDC=CreateMemDC();
if ((r==g)&&(r==b)) {
sprintf(StringT,"g %d",r);
TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
}
else {
sprintf(StringT,"r %d",r);
TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
sprintf(StringT,"g %d",g);
TextOut(hMemDC,xs+10,140,StringT,strlen(StringT));
sprintf(StringT,"b %d",b);
TextOut(hMemDC,xs+10,160,StringT,strlen(StringT));
k=(30*r+59*g+11*b)/100;
sprintf(StringT,"k %d",k);
TextOut(hMemDC,xs+10,180,StringT,strlen(StringT));
}
sprintf(StringT,"x %d",cur_x);
TextOut(hMemDC,xs+10,210,StringT,strlen(StringT));
sprintf(StringT,"y %d",cur_y);
TextOut(hMemDC,xs+10,230,StringT,strlen(StringT));
DeleteMemDC(hMemDC);
}
else if ((T_flag==IDM_LINE)&&(pxy_n==0)){ // 线段数据处理
pxy[0].x=cur_x; pxy[0].y=cur_y;
pxy_n=1; pxy_f=0;
DrawLine(cur_x-3,cur_y ,cur_x+3,cur_y ,color_tab[2]);
DrawLine(cur_x ,cur_y-3,cur_x ,cur_y+3,color_tab[2]);
}
else if ((T_flag==IDM_WINCAPT)&&(pxy_n==0)) { // 截取屏幕窗口
pxy[0].x=cur_x; pxy[0].y=cur_y;
pxy_n=1;
return 0;
}
InvalidateRect(hWnd,NULL,FALSE);
return 0;
}
int MouseMove(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
int i,j,k,r,g,b,cur_x,cur_y,x,y,xs;
char StringT[20];
DWORD color;
COLORREF clrref;
if (image->hdib==NULL) return 0;
cur_x=LOWORD(lParam); cur_y=HIWORD(lParam);
if (T_flag!=IDM_WINCAPT) {
if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
return 0;
}
if (T_flag==IDM_POINT) { // 单点数据动态
xs=700;
color=getpixel(Image[0],cur_x,cur_y);
if (Image[0]->bitcount==8) {
getpalette(Image[0],(int)color,&r,&g,&b);
clrref=RGB(r,g,b);
}
else {
clrref=DWORD2CLRREF(color);
r=(color>>16)&0xff; g=(color>>8)&0xff;
b=color&0xff;
}
FillDdbWin(xs,45,60,60,RGB(0,0,0),clrref);
FillDdbWin(xs,120,80,180,RGB(255,255,255),RGB(255,255,255));
hMemDC=CreateMemDC();
if ((r==g)&&(r==b)) {
sprintf(StringT,"g %d",r);
TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
}
else {
sprintf(StringT,"r %d",r);
TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
sprintf(StringT,"g %d",g);
TextOut(hMemDC,xs+10,140,StringT,strlen(StringT));
sprintf(StringT,"b %d",b);
TextOut(hMemDC,xs+10,160,StringT,strlen(StringT));
k=(30*r+59*g+11*b)/100;
sprintf(StringT,"k %d",k);
TextOut(hMemDC,xs+10,180,StringT,strlen(StringT));
}
sprintf(StringT,"x %d",cur_x);
TextOut(hMemDC,xs+10,210,StringT,strlen(StringT));
sprintf(StringT,"y %d",cur_y);
TextOut(hMemDC,xs+10,230,StringT,strlen(StringT));
DeleteMemDC(hMemDC);
}
else if ((T_flag==IDM_LINE)&&(pxy_n==1)) {//线段数据动态
if (pxy_f==1) {
LineData(1,1);
for (k=0;k<pxy_n;k++) {
i=pxy[k].x; j=pxy[k].y;
DrawLine(i-3,j,i+3,j,color_tab[2]);
DrawLine(i,j-3,i,j+3,color_tab[2]);
}
}
pxy[1].x=cur_x; pxy[1].y=cur_y;
LineData(1,0);
DrawLine(pxy[0].x,pxy[0].y,cur_x,cur_y,color_tab[2]);
}
else if (T_flag==IDM_WINCAPT) { // 截取屏幕窗口
if (pxy_f==1) {
for (k=1;k<pxy_n;k++) {
LineData(k,1);
}
}
if (pxy_n>0) {
x=pxy[0].x; y=pxy[0].y;
if ((x==cur_x)||(y==cur_y)) return(0);
pxy[1].x=cur_x; pxy[1].y=y;
pxy[2].x=cur_x; pxy[2].y=cur_y;
pxy[3].x=x; pxy[3].y=cur_y;
pxy[4].x=x; pxy[4].y=y;
pxy_n=5;
for (i=1;i<5;i++) {
LineData(i,0);
}
clrref=RGB(0,255,0);
for (i=0;i<4;i++) {
DrawLine(pxy[i].x,pxy[i].y,pxy[i+1].x,pxy[i+1].y,clrref);
}
}
}
else if (T_flag==IDM_IMAGEBROWSE) {
if ((cur_x<min(196,wid))&&(cur_y<min(271,hei)))
ImageBrowse(cur_x,cur_y); // 图像的同步漫游
}
pxy_f=1;
InvalidateRect(hWnd,NULL,FALSE);
return 0L;
}
int LButtonUp(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
int i,j,k,cur_x,cur_y,t,xs;
int r,g,b;
DWORD color;
COLORREF clrref;
int x0,y0,x1,y1,m,n,dx,dy;
struct DOT *dot;
if (image->hdib==NULL) return 0;
cur_x=LOWORD(lParam); cur_y=HIWORD(lParam);
if (T_flag!=IDM_WINCAPT) {
if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
return 0;
}
if ((T_flag==IDM_LINE)&&(pxy_n==1)) { // 线段数据处理
DrawLine(pxy[0].x,pxy[0].y,cur_x,cur_y,color_tab[2]);
pxy[1].x=cur_x; pxy[1].y=cur_y;
DrawLine(cur_x-3,cur_y,cur_x+3,cur_y,color_tab[2]);
DrawLine(cur_x,cur_y-3,cur_x,cur_y+3,color_tab[2]);
DrawLine(pxy[0].x-3,pxy[0].y,pxy[0].x+3,pxy[0].y,color_tab[0]);
DrawLine(pxy[0].x,pxy[0].y-3,pxy[0].x,pxy[0].y+3,color_tab[0]);
x0=pxy[0].x; y0=pxy[0].y;
x1=pxy[1].x; y1=pxy[1].y;
dx=abs(x1-x0); dy=abs(y1-y0);
dot=(struct DOT *) malloc(sizeof(struct DOT)*(dx+dy+2));
j=LineCoor(x0,y0,x1,y1,dot);
if (j>256) {
for (i=0;i<j;i++) {
k=(int) ((256.0*i+0.5)/j);
dot[k].x=dot[i].x; dot[k].y=dot[i].y;
}
j=256;
}
xs=750;
if (image->bitcount==8) {
n=300;
FillDdbWin(xs-19,n-256,15,258,RGB(0,0,0),RGB(255,255,255));
for (i=0;i<256;i++) {
getpalette(Image[0],i,&r,&g,&b);
clrref=RGB(r,g,b);
DrawLine(xs-18,n-i,xs-6,n-i,clrref);
}
FillDdbWin(xs,n-256,260,260,0x00ffffff,0x00ffffff);
DrawLine(xs,n-256,xs+256,n-256,color_tab[7]);
DrawLine(xs,n,xs+256,n,color_tab[7]);
clrref=RGB(255,0,0);
t=getpixel(Image[0],dot[0].x,dot[0].y);
for (i=1;i<j && i<256;i++) {
k=getpixel(Image[0],dot[i].x,dot[i].y);
DrawLine(xs-1+i,n-t,xs+i,n-k,clrref);
t=k;
}
}
else if (image->bitcount==24) {
for (m=0;m<3;m++) {
n=165*(m+1);
FillDdbWin(xs,n-162,260,165,RGB(255,255,255),RGB(255,255,255));
DrawLine(xs,n-160,xs+256,n-160,color_tab[2*m]);
DrawLine(xs,n,xs+256,n,color_tab[2*m]);
if (m==0) clrref=RGB(255,0,0);
else if (m==1)clrref=RGB(0,255,0);
else if (m==2)clrref=RGB(0,0,255);
color=getpixel(Image[0],dot[0].x,dot[0].y);
t=(int) (159.0*((color>>(8*(2-m)))&0xff)/255);
for (i=1;i<j && i<256;i++) {
color=getpixel(Image[0],dot[i].x,dot[i].y);
k=(int) (159.0*((color>>(8*(2-m)))&0xff)/255);
DrawLine(xs-1+i,n-t,xs+i,n-k,clrref);
t=k;
}
}
}
free(dot);
pxy_n=0;
}
else if ((T_flag==IDM_WINCAPT)&&(pxy_n)) { // 截取屏幕窗口,终点处理
if (pxy_f==1) {
for (k=1;k<pxy_n;k++) {
LineData(k,1);
}
}
x0=pxy[0].x; y0=pxy[0].y;
if (cur_x<x0) {
t=cur_x; cur_x=x0; x0=t;
}
if (cur_y<y0) {
t=cur_y; cur_y=y0; y0=t;
}
dx=cur_x-x0+1; dy=cur_y-y0+1;
WinCapt(hWnd,Image[0],x0,y0,dx,dy);
ClearDDB();
WriteDDB(Image[0],0,0,0,0,dx,dy);
wid=Image[0]->wid; hei=Image[0]->hei;
for (i=1;i<9;i++)
if (Image[i]->hdib) ImageClose(Image[i]);
ImageCopy(0,9);
T_flag=0;
}
InvalidateRect(hWnd,NULL,FALSE);
pxy_f=0;
return 0;
}
void ImageRotate(struct IMAGE *img1,struct IMAGE *img2,double alpha)
{
int i,j,x,y,ww,r,g,b;
int Yd,Dx,Dy,bpl,bpp,bits,max,maxn;
double centerx,centery,sintheta,costheta;
double X1,Y1,X2,Y2,theta,xx,yy,rr;
BYTE *sc,*p;
char **list;
Dx=img1->wid; Dy=img1->hei;
bpl=(int) img1->bpl;
bpp=(int) img1->bpp;
bits=img1->bitcount;
sc=(BYTE*) malloc(2*bpl);
list=(char**)malloc(Dy*sizeof(char*));
for (i=0;i<Dy;i++) list[i]=img1->lpbits+(Dy-1-i)*bpl;
centerx=Dx/2; centery=Dy/2;
rr=sqrt(centerx*centerx+centery*centery);
theta=atan((double) centery/(double) centerx);
X1=fabs(rr*cos(alpha+theta));
Y1=fabs(rr*sin(alpha+theta));
X2=fabs(rr*cos(alpha-theta));
Y2=fabs(rr*sin(alpha-theta));
if (X2>X1) X1=X2;
if (Y2>Y1) Y1=Y2;
ww=(int) (2*X1);
ImageCreate(img2,ww,(int) (2*Y1),bits);
if (bits==8) {
max=maxn=0;
for (i=0;i<256;i++) {
getpalette(img1,i,&r,&g,&b);
setpalette(img2,i,r,g,b);
if (r+g+b>max) {
max=r+g+b; maxn=i;
}
}
}
sintheta=sin(alpha);
costheta=cos(alpha);
for (j=(int)(centery-Y1),Yd=0;j<=centery+Y1;j++,Yd++) {
if (bits==8)
memset(sc,maxn,ww);
else
memset(sc,220,ww*bpp);
for (i=(int)(centerx-X1),p=sc;i<=centerx+X1;i++,p+=bpp) {
xx=centerx+costheta*(i-centerx)+sintheta*(j-centery);
yy=centery-sintheta*(i-centerx)+costheta*(j-centery);
x=(int) xx; y=(int) yy;
if ((x>=0)&&(x<Dx)&&(y>=0)&&(y<Dy)) {
memcpy(p,&list[y][bpp*x],bpp);
}
}
setimage(img2,0,Yd,ww,1,sc);
}
free(list);
free(sc);
}
void FillHdcWin(HDC hDC,int x,int y,int Dx,int Dy,
COLORREF clrref1,COLORREF clrref2)
{
LOGPEN lppena = {PS_SOLID,1,1,RGB(0,0,0)};
HPEN hPen;
HBRUSH hBrush;
lppena.lopnColor=clrref1;
hPen=(HPEN) SelectObject(hDC,CreatePenIndirect(&lppena));
hBrush=(HBRUSH) SelectObject(hDC,CreateSolidBrush(clrref2));
Rectangle(hDC,x,y,x+Dx,y+Dy);
DeleteObject(SelectObject(hDC,hPen));
DeleteObject(SelectObject(hDC,hBrush));
}
void Clear(HWND hWnd)
{
int i;
for (i=0;i<9;i++)
if (Image[i]->hdib) ImageClose(Image[i]);
ClearDDB();
InvalidateRect(hWnd,NULL,FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -