| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1112 人关注过本帖
标题:用于TC下的截屏代码。
只看楼主 加入收藏
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
 问题点数:0 回复次数:4 
用于TC下的截屏代码。
使用方法:以下代码,可以保存到一个文件,例如CPYSCR.H,放到INCLUDE文件夹下。

/**************************************/
/* Desc:    用于拷贝TC下的屏幕        */
/* By:        hoodlum1980    */
/* Email: jinfd@         */
/* QQ:         17777538         */
/* Date:    2008-02-25        */
/**************************************/

/* Include All Needed Header*/
#if !defined(__STDIO_DEF_)
#include <stdio.h>
#endif
#ifndef ptrdiff_t
#include <mem.h>
#endif
#if    !defined(__COLORS)
#include <graphics.h>
#endif

/*#define MAX_X 640;*/
/*#define MAX_Y 480;*/

void CopyScreen(char* filename,int left,int top,int right,int bottom);

/* pixel : keep channel order with readfile order */
typedef struct _PIXEL
{
    unsigned char b;
    unsigned char g;
    unsigned char r;
} PIXEL;

/* color item in palette */

typedef struct _RGBQUAD
{
    unsigned char rgbBlue;
    unsigned char rgbGreen;
    unsigned char rgbRed;
    unsigned char rgbReserved;
} RGBQUAD;

/* bitmap file header */

typedef struct _BITMAPFILEHEADER
{
    unsigned int type;
    long fileSize;
    long reserved;
    long offbits;
} BITMAPFILEHEADER,*PBITMAPFILEHEADER;

/* bitmap info header */

typedef struct _BITMAPINFOHEADER
{
    long dwSize;
    long width;
    long height;
    int  planes;
    int  bpp;
    long compression;
    long sizeImage;
    long hResolution;
    long vResolution;
    long colors;
    long importantColors;
} BITMAPINFOHEADER,*PBITMAPINFOHEADER;


/* copy the screen and save to a bmp file */
/* filename- filename of bmp file */
/* 将把屏幕截图保存为一个bpp=4的位图 */

void CopyScreen(char* filename,int left,int top,int right,int bottom)
{
    int i,j,width,height,bpp=4,colorUsed=16,stride,index0,index1;
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;
    RGBQUAD *palette;
    unsigned char *pPixels;
    FILE *stream;
    int COLORS[16][3]=
    {
        /* R   G   B        Index    ColorName            */
        {  0,  0,  0},     /* 00 Black                    */
        {  0,  0,255},     /* 01 Blue                    */
        {  0,128,  0},    /* 02 Green                    */
        {  0,255,255},     /* 03 Cyan                    */
        {255,  0,  0},     /* 04 Red                        */
        {255,  0,255},     /* 05 Magenta                */
        {165, 42, 42},     /* 06 Brown                    */
        {211,211,211},     /* 07 LightGray            */
        {169,169,169},     /* 08 DarkGray            */
        {173,216,230},     /* 09 LightBlue            */
        {144,238,144},     /* 10 LightGreen        */
        {144,238,238},    /* 11 LightCyan            */
        {238,144,144},     /* 12 LightRed            */
        {238,144,238},     /* 13 LightMegenta    */
        {255,255,  0},     /* 14 Yellow                */
        {255,255,255},    /* 15 White                    */
    };

    width=right-left+1;
    height=bottom-top+1;
    stride=(width*bpp+31)/32*4;
    /* fill file header */
    fileHeader.type=0x4D42;    /* filetype:"BM" ascii code */
    fileHeader.fileSize=sizeof(infoHeader);
    fileHeader.fileSize+=sizeof(RGBQUAD)*colorUsed;
    fileHeader.fileSize+=((long)stride)*height;
    fileHeader.reserved=0;
    fileHeader.offbits=sizeof(fileHeader)+sizeof(infoHeader)+4*16;

    /* fill info header */
    infoHeader.dwSize=sizeof(BITMAPINFOHEADER);
    infoHeader.width=width;
    infoHeader.height=height;
    infoHeader.planes=1;    /* must set to 1 */
    infoHeader.bpp=bpp;
    
    infoHeader.sizeImage=((long)stride)*height;
    infoHeader.hResolution=0x27;
    infoHeader.vResolution=0x27;
    infoHeader.colors=16;
    infoHeader.importantColors=0;

    /* fill RGBQUAD items */
    palette=malloc(sizeof(RGBQUAD)*16);
    if(palette==NULL)
    {
        printf("malloc for palette fail!");
        return;
    }
    for(i=0;i<16;i++)
    {
        palette[i].rgbRed = COLORS[i][0];
        palette[i].rgbGreen = COLORS[i][1];
        palette[i].rgbBlue = COLORS[i][2];
        palette[i].rgbReserved = 0;
    }

    /* open the file in wb mode */
    stream=fopen(filename,"wb");
    if(stream==NULL)
    {
        printf("\nOpen file fail!\n");
        return;
    }
    fwrite(&fileHeader,sizeof(fileHeader),1,stream);
    fwrite(&infoHeader,sizeof(infoHeader),1,stream);
    fwrite(palette,sizeof(RGBQUAD),16,stream);
    free(palette);

    /* write the bitmap data: color indexes ,bpp=4 */
    pPixels=malloc(stride);
    if(pPixels==NULL)
    {
        printf("\nAllocate Memory for pPixels fail!\n");
        return;
    }
    for(j=bottom;j>=top;j--)
    {
        memset(pPixels,0,stride);
        for(i=left;i<=right;i+=2)
        {
            /* 2 pixels to 1 byte */
            index0=getpixel(i,j);
            index1=(i==right)? 0: getpixel(i+1,j);
            pPixels[i/2]=(index0<<4)+index1;
        }
        fwrite(pPixels,1,stride,stream);
    }
    fclose(stream);
}

————————————————————————————文件结束分割线————————————————————————————————
使用方法非常简单,
只有一个主要的函数,就是CopyScreen(char* file,int left,int top,int right,int bottom);

例如
#include <CPYSCR.H>
main()
{
     ......
    CopyScreen("C:\\TC\\1.bmp",0,0,600,480);
}

以上代码把屏幕保存成为一个BMP位图,(bpp=4),即4bit/pixel。当然,这里我们使用的是默认的系统调色板颜色~~~~,如果用户改变了调色板颜色就会导致颜色不一致了。

[[it] 本帖最后由 hoodlum1980 于 2008-2-25 11:15 编辑 [/it]]
收到的鲜花
  • xianshizhe1112008-02-25 11:30 送鲜花  5朵   附言:我很赞同
搜索更多相关主题的帖子: 代码 
2008-02-25 11:13
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
楼主有你的呀!赞了.
2008-02-25 11:29
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
帮你顶一下,原创啊,虽然我不用graphics
2008-02-25 12:38
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo]以下是引用 [un]xianshizhe111[/un] 在 2008-2-25 11:29 的发言:[/bo]

楼主有你的呀!赞了.



谢谢了,这是此前我为了截屏TC效果写的一个函数。由于没有DC,所以在windows系统下的普通截图方法没有办法。这个代码节选自我的blog上的一篇帖子:
《C语言读取和显示BMP图片》
http://
2008-02-25 14:42
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
不怎么喜欢tc但还是顶下
2008-02-25 15:41
快速回复:用于TC下的截屏代码。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032181 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved