金橋科普  
設為首頁 關于我們 郵箱登錄
科普聚焦
您現在的位置: 首頁 >> 科普頻道 >> 電腦遊戲 >> 文章詳情
如何實現遊戲截屏功能

SoftBoy  gameres 2006-08-11

如何實現遊戲截屏功能


  現在很多遊戲都提供一種截屏的功能,用來截取遊戲中的畫面,那麼這是如何實現的呢?其實就是把遊戲當前屏幕的數據存成一個圖片文件;在這裡我給出一段源程序,它實現了DirectDraw(16位模式)下的的遊戲截屏。生成的文件格式為BMP,程序有比較詳細的注釋,請各位自己看吧。

  現在很多遊戲都提供一種截屏的功能,用來截取遊戲中的畫面,那麼這是如何實現的呢?其實就是把遊戲當前屏幕的數據存成一個圖片文件;在這裡我給出一段源程序,它實現了DirectDraw(16位模式)下的的遊戲截屏。生成的文件格式為BMP,程序有比較詳細的注釋,請各位自己看吧。

bool Is555; // 是否是565模式,這個變量需要用者填寫

// 功能:將一個16位的DirectDraw表面,存為一張24位BMP位圖 (傳入主表面即截屏)
// 輸入:表面指針,輸出的文件名
// 輸出:是否成功
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
    WORD* lpBuffer; // 表面指針
    int nPitch; // 表面跨距
    int nWidth, nHeight; // 表面寬高

    // 打開文件s
    FILE* fp;
    if( (fp=fopen(filename, "wb")) != NULL )
    {
        // 鎖定表面
        DDSURFACEDESC ddsd;
        ddsd.dwSize = sizeof(ddsd);
        HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
        if( ddrval == DD_OK )
        {
            lpBuffer = (WORD *)ddsd.lpSurface;
            nWidth = ddsd.dwWidth;
            nHeight = ddsd.dwHeight;
            nPitch = ddsd.lPitch >> 1; //lPitch以Byte為單位,GraphPitch以WORD為單位。所以GraphPitch = lPitch / 2;
        }

        // 保存文件頭
        BITMAPFILEHEADER FileHeader;
        FileHeader.bfType = 'BM';
        FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
        FileHeader.bfReserved1 = 0;
        FileHeader.bfReserved2 = 0;
        FileHeader.bfOffBits = 0x36;
        fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

        // 保存文件信息
        BITMAPINFOHEADER Header;
        Header.biSize = sizeof(BITMAPINFOHEADER); // 結構的大小
        Header.biWidth = nWidth; // 寬
        Header.biHeight = nHeight; // 高
        Header.biPlanes = 1; // 固定
        Header.biBitCount = 24; // 顏色數
        Header.biCompression = BI_RGB; // 是否壓縮
        Header.biSizeImage = nWidth * nHeight * 3; // 圖片的大小
        Header.biXPelsPerMeter = 0;
        Header.biYPelsPerMeter = 0;
        Header.biClrUsed = 0;
        Header.biClrImportant = 0;
        fwrite(&Header, Header.biSize, 1, fp);

        // 寫入具體內容(從下向上存放)
        fseek(fp, 0x36, SEEK_SET);
        WORD word;
        lpBuffer += nWidth * (nHeight - 1);
        for(int i=0; i
{
            for(int j=0; j {
                word = *lpBuffer;
                fputc( GetBlue( word ), fp); // 藍
                fputc( GetGreen( word ), fp); // 綠
                fputc( GetRed( word ), fp); // 紅
                lpBuffer++;
            }
            lpBuffer -= nPitch*2; // 指針轉到上一行的開始
        }

        fclose(fp);

        // 解鎖表面
        ddrval = lpSurface->Unlock( NULL );
        return true;
    }

    return false;
}

inline unsigned char GetRed(WORD color)
{
    if( Is555 )
        return (color>>7) & 0xff;
    else
        return (color>>8) & 0xff;
}

inline unsigned char GetGreen(WORD color)
{
    if( Is555 )
        return (color>>2) & 0xff;
    else
        return (color>>3) & 0xff;
}

inline unsigned char GetBlue(WORD color)
{
    return (color & 0x1f) << 3;
}

------------------------
金點時空
softboy
2001.5.9
http://www.gpgame.com
------------------------

  發表評論 寫信給編輯 關閉窗口
同欄目內容
· 瑞典在網遊中開設虛擬大使館 2007-06-06
· 魔獸爭霸3秘籍(魔獸無敵秘籍) 2007-03-28
· 從頭學習DirectDraw 2006-08-11
· DirectShow全屏播放視頻 2006-08-11
· 遊戲基礎:我該使用何種語言 2006-08-11
· 遊戲開發 ──物品管理系統 2006-08-07
相關內容
近期主推
西藏發現青藏高原最大冰川群
·西藏發現青藏高原最大冰川群
·中日: "月亮女神"攜手"嫦娥"
·行星大碰撞砸死恐龍催生人類
·美研制會飛汽車定價9萬美元
·美國教授設計出自適應機器人
·銀河系可能有20多個黑洞
近期熱門
英海域驚現大龍蝦為普通龍蝦5倍
·英海域驚現大龍蝦為普通龍蝦5倍
·新物種金蛙體表有劇毒
·我國嫦娥工程計劃測量月球
·精神病藥物可治多種癌症
·視覺震撼:來自海底的精靈
·能刪除不良記憶的藥物誕生
近期焦點
廣西發現罕見溶洞鐘乳石有30萬年
·廣西發現罕見溶洞鐘乳石有30萬年
·澳大利亞驚現“卡布基諾”海灘
·美國"彩色"瀑布夜幕下震撼遊人
·地球上究竟有多少個物種
·英國探險家北極遊泳破紀錄
·世界之最 世上最小的動物
金橋科普是一個公益性欄目,內容由作者提供或摘自互聯網,其目的是向廣大網民普及科學技術知識。如果您發現本網站轉載或摘編了您擁有著作權的作品,請通知我們(電話:023-63659911),我們立即刪除。
關于我們 | 網站地圖 | 用戶注冊 | 廣告客戶 | 招聘信息 | 業務信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重慶科技咨詢中心.重慶網得信息技術有限公司.版權所有
Email:webmaster@jqinfo.com
重慶數據通信局提供網絡帶寬. 渝ICP備05002327號