有用C#写过DirectDraw的人请进!急

happyangelclc 2003-04-29 11:25:16
Surface 中的Lock()返回的是什么东西啊,怎样不用指针来读写Surface中的内存

//为什么这里的上限都是50,本来宽应该是50*(32/8)才对啊
//而且我给数组按4字节一个像素符值的时候结果与意料的也不一样
SurfaceDescription desc = new SurfaceDescription();
desc.SurfaceCaps.OffScreenPlain=true;
desc.Width=50;
desc.Height=50;
Surface offscreen;
offscreen = new Surface(desc, draw);//draw is DriectDraw Object
Trace.WriteLine(offscreen.SurfaceDescription.PixelFormatStructure.RgbBitCount)
//Output is 32,the surface's pixelformat are 32 bits=4 bytes
byte[,] mem=offscreen.Lock(LockFlags.Wait);
Trace.WriteLine(mem.GetLength(0));//output 50
Trace.WriteLine(mem.GetLength(1));//output 50
Trace.WriteLine(mem.GetUpperBound(0));//output 49
Trace.WriteLine(mem.GetUpperBound(1)); //output 49
//为什么这里的上限都是50,本来宽应该是50*(32/8)才对啊
//而且我给数组按4字节一个像素符值的时候结果与意料的也不一样
offscreen.Unlock(mem);
...全文
56 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT写轮眼 2003-09-16
  • 打赏
  • 举报
回复
帮你up一下,我现在也被这个问题困扰。
paulluo0739 2003-05-13
  • 打赏
  • 举报
回复
VC的代码我看过,但是现在C#里面返回值不是指针,而是只有byte[,]的二维数组,很郁闷啊。
one_add_one 2003-05-11
  • 打赏
  • 举报
回复
给你一个VC的。。

bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
WORD* lpBuffer; // 表面指针
int nWidth, nHeight; // 表面宽高

// 打开文件
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;
}

// 保存文件头
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 = 16; // 颜色数
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);

for(int i=0; i<nHeight; i++)
{
lpBuffer = (WORD*)ddsd.lpSurface + nWidth*(nHeight-i-1);
for(int j=0; j<nWidth; j++)
{
//565 to 555
int a,b,c;
a=*lpBuffer & 0x1f;
b=(*lpBuffer>>5) & 0x3f;
c=(*(lpBuffer+1)>>11) & 0x1f;
b>>=1;
WORD lpb=a+(b<<5)+(c<<10);

fputc((char)(lpb & 0xff), fp);
fputc((char)(lpb >> 8), fp);

lpBuffer++;
}
}

fclose(fp);

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

return false;
}
paulluo0739 2003-05-09
  • 打赏
  • 举报
回复
我正在做,正是我想问的。借你的帖子了!
paulluo0739 2003-05-09
  • 打赏
  • 举报
回复
up,我急啊!兄弟们快来帮帮忙啊!

8,324

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧