资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
图形图象程序设计基础常用颜色模式RGBRGB模式ABGRRGBA模式ARGBBGRA模式RGB(255,0,0)0xff0000ff0xffff000024位32位存放颜色的数据结构及其合成RGB模式:COLORREF clr;clr=RGB(R,G,B); RGBA模式:UINT clr;clr=(A24;a2=(UINT)clr224;if(a2=0) return clr1; if(a1=255) return clr1;if(a1=0) return clr2;ARGBr1=clr1g1=clr1b1=clr1r2=clr2g2=clr2b2=clr2r=(UINT)(255-a1)*r2+a1*r1)24;g=(UINT)(255-a1)*g2+a1*g1)16;b=(UINT)(255-a1)*b2+a1*b1)8;a=(a1a2?a1:a2);ARGBnew_color=(UINT)(aGetSafeHdc(),x,y,wid,hei, 0,0,wid,hei,buf, 例:在800*600窗口中显示一个矩形。直接写入设备缓冲区:CClientDC dc(this);int x,y;for(y=100; yincrex)tamp=increx;increx=increy;increy=tamp;interchange=1;else interchange=0;e=increy+increy-increx;for(i=0;i=0) if(interchange=1) x=x+s1;else y=y+s2;e=e-increx-increx;if(interchange=1) y=y+s2;else x=x+s1;e=e+increy+increy; 写一块图象到内存图象缓冲区的指定位置void write_video(int x0,int y0,int dx,int dy,UINT *image) int i,j,x1,y1,x2,y2, add,add0,ad,ad0=0;add0=y0*WIN_WID+x0;for(i=y0;iy0+dy;i+) add=add0; ad=ad0;for(j=x0;jx0+dx;j+) bufadd+=imagead+;ad0+=dx; add0+=WIN_WID; 叠加一块图象到内存图象缓冲区的指定位置void overlay_video(int x0,int y0,int dx,int dy,UINT *image) int i,j,x1,y1,x2,y2, add,add0,ad,ad0=0;add0=y0*WIN_WID+x0;for(i=y0;iy0+dy;i+) add=add0; ad=ad0;for(j=x0;jx0+dx;j+) bufadd=overlay_color(imagead+, bufadd);add+; ad0+=dx; add0+=WIN_WID; 叠加半透明玻璃for(y=200; y=300; y+)for(x=200; x=300; x+)bufy*WIN_WID+x=overlay_color(0x800000ff, bufy*WIN_WID+x);out_buf(0,0, WIN_WID,WIN_HEI,buf);彩色图象转换为黑白图象(灰度化)灰度值: z=0.3R+0.59G+0.11BUCHAR *c, z;for(y=0; yWIN_HEI; y+)for(x=0; xWIN_WID; x+) c=(UCHAR *) (buf+y*WIN_WID+x);z=(UCHAR)(0.11*c0+0.59*c1+0.3*c2);c0=z; c1=z; c2=z;B G R AC读取BMP图象格式文件BYTE *bitbuf; void ReadBmp(char *fname,int wid,int hei,UINT *buf) int i,j,k,dx,dy,count,pnum,headersize;CFile file;BITMAPFILEHEADER fileheader; /文件头BITMAPINFOHEADER inheader; /信息头BYTE *bits,*bitbuf,*tmp;RGBQUAD pall256; /调色板if(!file.Open(fname,CFile:modeRead) )memset(buf,0,wid*hei*sizeof(int); return 0;file.Read(file.Read(dx=inheader.biWidth; /原图象宽度dy=inheader.biHeight; /原图象宽度count=inheader.biBitCount; /一象素所占位数pnum=inheader.biClrUsed;headersize=fileheader.bfOffBits; /文件头长度if(count=1if(count=4if(count=8if(pnum)file.Read(pall,sizeof(RGBQUAD)*pnum) ;bits=new BYTEdx*4; if(wid=dxelse bitbuf=new BYTEdx*dy*4;file.Seek(headersize,CFile:begin);/ 读8位图象if(count=8)tmp=bitbuf; for(i=0;idy;i+) file.Read(bits,(dx+3)/4*4);bitbuf=tmp+(dy-i-1)*dx*4;for(j=0;jdx;j+) k=bitsj; *bitbuf+=pallk.rgbBlue;*bitbuf+=pallk.rgbGreen;*bitbuf+=pallk.rgbRed;*bitbuf+=255;bitbuf=tmp;else if(count=24) tmp=bitbuf;for(i=0;idy;i+) file.Read(bits,(dx*3+3)/4*4);bitbuf=tmp+(dy-i-1)*dx*4;for(j=0;jdx;j+) *bitbuf+=bitsj*3; *bitbuf+=bitsj*3+1;*bitbuf+=bitsj*3+2; *bitbuf+=255; bitbuf=tmp; else if(count=32) tmp=bitbuf;for(i=0;idy;i+) file.Read(bits,dx*4); bitbuf=tmp+(dy-i-1)*dx*4; for(j=0;jdx;j+) *bitbuf+=bitsj*4; *bitbuf+=bitsj*4+1;*bitbuf+=bitsj*4+2; bitbuf+=bitsj*4+3; bitbuf=tmp; delete bits;file.Close();if(wid!=dx|hei!=dy) Buf_Resize(dx,dy,(UINT*)bitbuf,wid,hei,buf); delete bitbuf;return 1; 图象缩放函数void Buf_Resize(int wid,int hei,UINT *sbuf,int dx,int dy,unsigned int *dbuf) int i,j,k,k0,add0;float xstep,ystep,xx,yy;xstep=(float)(wid-1)/(dx-1);ystep=(float)(hei-1)/(dy-1);k0=0; k=0;if(dxwidyyhei;yy+=ystep) add0=(int)yy*wid; k=k0; for(xx=0;xxwid;xx+=xstep)dbufk+=sbuf(int)(add0+xx); k0+=dx; else for(i=0;idy;i+) /放大 add0=(int)(i*ystep)*wid; for(j=0;jdx;j+)dbufk+=sbuf(int)(add0+j*xstep);使用以上函数读取BMP图象的例子int dx=400,dy=300;UINT *image;image=new UINTdx*dy;ReadBmp(“mary.bmp”,dx,dy,image);write_video(100,100,dx,dy,image);line(150,150,300,300,0xffff0000);out_buf(0,0,WIN_WID,WIN_HEI,buf);
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号