RSS
热门关键字:  眼泪
当前位置 :| 主页>最新英雄合击>

想让自己在游戏中的风采留下纪念吗?教你截屏实现

来源: 作者:管理员 时间:2008-07-16 Tag: 点击:
在这里我给出一段源程序,它实现了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;
}

现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;以上我所发布的就是能够实现截屏的源程序,大家不防试试看.


上一篇:我最爱的冰
下一篇:没有了
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册