首页 > 编程资源分享区 > C/C++源代码共享 > 图形模式下的抓屏程序
2006
05-30

图形模式下的抓屏程序





点击此处下载

#include
#include
#include
#include
#include
#define MAX_WIDTH 640
#define MAX_HEIGHT 480
/*说明:
  1.图象文件的大小(单位字节)计算为:biWidth*biHeight*biBitCount/8
  2.位图文件的大小为:图象文件的大小+所有信息头所占的字节数
  3.bfOffBits计算为:位图文件的大小-图象文件的大小(即所有信息头的大小)
  4.水平、垂直分辨率、biClrUsed、biClrImportant全置为0
  5.彩色信息表中的颜色强度应置为多少??(相对4位来说)
  6.位图数据每一行(图象扫描行)的字节数为:biWidth*biBitCount/8
*/
struct BITMAPFILEHEADER  /*位图文件头*/
{
 char bfType[2]; /*文件类型说明,各占一个字节,windows系统中为BM*/
 long bfSize;    /*位图文件的大小*/
 int bfReserved1;/*保留字节,都为零,共两个保留*/
 int bfReserved2;
 long bfOffBits; /*从文件头开始到实际的图象数据间的字节偏移量*/
}BMPHeader={“BM”,0,0,0,118};


/*位图信息头由位图信息头(bitmap-informationheader)和彩色表(color table)组成*/
struct BITMAPINFO
{
 /*位图信息头*/
 long biSize;  /*位图信息头的大小,共四字节*/
 long biWidth; /*图象的宽度和高度,各占四个字节*/
 long biHeight;
 int  biPlanes; /*为目标设备说明位面数,总为1,占两个字节*/
 int  biBitCount; /*说明比特数/象素,其值为1、4、8、16、24、32占两字节*/
 long biCompression; /*说明压缩类型,共四个字节,0为没压缩??*/
 long biSizeImage;   /*说明图象的大小,以字节为单位,共四个字节*/
 long biXPelsPerMeter; /*说明水平分辨率,用象素/米表示,共四字节*/
 long biYPelsPerMeter; /*说明垂直分辨率,用象素/米表示,共四字节*/
 long biClrUsed; /*位图实际使用的彩色表中的颜色索引数,为0表使用所有调色板项*/
 long biClrImportant;/*对图象显示有重要影响的颜色索引数目,为0表都重要四字节*/
}BMPInfo={40,MAX_WIDTH,MAX_HEIGHT,1,4,0,0,3780,3780,0,0};


/*color information table,set blue,green and red intensity*/
struct PALETTE_BOARD
{
 int rgbBlue;
 int rgbGreen;
 int rgbRed;
 int rgbReserved;
}Pal[16]=
{
{0,0,255,0},{255,0,0,0},{0,255,0,0},{0,255,255,0},{128,128,2 55,0},{255,255,0,0},
{255,255,255,0},{0,0,0,0},{128,128,128,0},{192,192,192,0},{1 28,0,255,0},
{128,255,128,0},{255,128,255,0},{255,128,0,0},{255,255,136,0 },{0,64,128,0}
};
/*依次为红,蓝,绿,黄,浅红,青,白,黑,深灰,浅灰,洋红,浅绿,浅洋红,浅蓝,浅青,棕色*/


/*根据扫描得到的颜色与彩色信息表对照,并返回颜色索引号(即数组序号)*/
unsigned int get_index(int x,int y)
{
 unsigned int index_num;
 switch(getpixel(x,y))
        {
         case RED:index_num=0;break;
         case BLUE:index_num=1;break;
         case GREEN:index_num=2;break;
         case YELLOW:index_num=3;break;
         case LIGHTRED:index_num=4;break;
         case CYAN:index_num=5;break;
         case WHITE:index_num=6;break;
         case BLACK:index_num=7;break;
         case DARKGRAY:index_num=8;break;
         case LIGHTGRAY:index_num=9;break;
         case MAGENTA:index_num=10;break;
         case LIGHTGREEN:index_num=11;break;
         case LIGHTMAGENTA:index_num=12;break;
         case LIGHTBLUE:index_num=13;break;
         case LIGHTCYAN:index_num=14;break;
         case BROWN:index_num=15;break;
        }
 return index_num;
}


void scan_screen(FILE *fp)
{
 int i,j;
 union COLOR     /*two dots hold one byte*/
 {
  unsigned char clr;
  struct
  {
   unsigned cl:4;
   unsigned ch:4;
  }mycolor;
 }color;
 for(i=MAX_HEIGHT-1;i>=0;i–)
        for(j=0;j                  {
                  color.mycolor.ch=get_index(j,i); /*first dot*/
                  color.mycolor.cl=get_index(j+1,i); /*next dot*/
                  fwrite(&color.clr,1,1,fp);
                 }
 sound(1500); /*bell,tell you that print screen is over*/
 delay(4000);
 nosound();
}


void Screen_Save(char *filename)
{
 FILE *fp;
 int i;
 if((fp=fopen(filename,”wb”))==NULL)exit(0);
 /*write bitmap file information*/
 fwrite(BMPHeader.bfType,2,1,fp);
 BMPInfo.biSizeImage=BMPInfo.biWidth*BMPInfo.biHeight*B MPInfo.biBitCount/8;
 BMPHeader.bfSize=BMPInfo.biSizeImage+BMPHeader.bfOffBi ts;
 fwrite(&BMPHeader.bfSize,4,1,fp);
 fwrite(&BMPHeader.bfReserved1,2,1,fp);
 fwrite(&BMPHeader.bfReserved2,2,1,fp);
 fwrite(&BMPHeader.bfOffBits,4,1,fp);
 /*写位图信息头和色彩表信息*/
 BMPInfo.biSize=sizeof(struct BITMAPINFO);
 fwrite(&BMPInfo.biSize,4,1,fp);
 fwrite(&BMPInfo.biWidth,4,1,fp);
 fwrite(&BMPInfo.biHeight,4,1,fp);
 fwrite(&BMPInfo.biPlanes,2,1,fp);
 fwrite(&BMPInfo.biBitCount,2,1,fp);
 fwrite(&BMPInfo.biCompression,4,1,fp);
 fwrite(&BMPInfo.biSizeImage,4,1,fp);
 fwrite(&BMPInfo.biXPelsPerMeter,4,1,fp);
 fwrite(&BMPInfo.biYPelsPerMeter,4,1,fp);
 fwrite(&BMPInfo.biClrUsed,4,1,fp);
 fwrite(&BMPInfo.biClrImportant,4,1,fp);
 /*write color information table*/
 for(i=0;i<16;i++)
        {
         fwrite(&Pal.rgbBlue,1,1,fp);
         fwrite(&Pal.rgbGreen,1,1,fp);
         fwrite(&Pal.rgbRed,1,1,fp);
         fwrite(&Pal.rgbReserved,1,1,fp);
        }
 /*写位图数据*/
 scan_screen(fp);
 fclose(fp);
}


void initgr(void) /*BGI图形初始化*/
{
 int gd=DETECT,gm=0;
 registerbgidriver(EGAVGA_driver);
 initgraph(&gd,&gm,”");
}


void main(void)
{
 initgr();


 /*这里可以添加自己的代码丰富屏幕*/
 setcolor(RED);
 outtextxy(300,100,”hello”);
 setcolor(GREEN);
 outtextxy(250,90,”what’s your name?”);
 setcolor(YELLOW);
 rectangle(200,110,240,140);
 setfillstyle(1,CYAN);
 floodfill(201,111,YELLOW);
 /*这里可以添加自己的代码丰富屏幕*/


 Screen_Save(“save1.bmp”);
 getch();
 closegraph();
}


留下一个回复