directdraw:载入图象到DirectDraw(不用winapi的方式)



typedef struct BMPHD//bmp图像信息结构
{
    DWORD biSize;//bmp信息结构大小
    LONG biWidth;//图像宽度
    LONG biHeight;//图像高度
    WORD biPlanes;//
    WORD biBitCount;//颜色深度(8位以下都是调色板模式8位是256色调色板16位是高彩24位是真彩32位是带alpha通道真彩)
    DWORD biCompression;//是否压缩
    DWORD biSizeImage;//象素数据大小(以字节计算)为零时自己计算大小
    LONG biXPelsPerMeter;//
    LONG biYPelsPerMeter;//
    DWORD biCirUsed;//调色板中包含颜色数目
    DWORD biCirImportant;//
}BMPIH,FAR *LPBMPIH,*PBBMPIF;

//其实这类型结构vc++自带不用写出来BMPIH变为BITMAPINFOHEADER
//这里只是为了介绍说明这结构使用方法
typedef struct tagRGBQUAD
{
    BYTE Blue;
    BYTE Green;
    BYTE Red;
    BYTE reserve;//没有用
}RGBQUAD;
//RGBQUAD rgb[x];有调色板中包含颜色数目为x
BMPIH bmpfh;//BITMAPINFOHEADER bmpfh;


stream bmpf(filename,ios::in|ios::binary);
BITMAPFILEHEADER bmpfilehdr;
bmpf.seekg((bmpfilehdr),ios::beg);//bmp文件头没有用,直接跳过
bmpf.read((char *)&bmpfh,(bmpfh));//读取文件头
t=bmpfh.biSizeImage;
(t0)
    t=((bmpfh.biWidth*(bmpfh.biBitCount/3)+3)&~3)*bmpfh.biHeight;//象素数据大小

(以字节计算)
 (bmpfh.biBitCount8)
{
     ncolors;
     (bmpfh.biClrUsed0)
        ncolors=256;
    
        ncolors=bmpfh.biClrUsed;

    RGBQUAD* quad= RGBQUAD[ncolors];
    bmpf.read( (char*)quad, (RGBQUAD)*ncolors );
    CreatePalette( quad, ncolors );//如果表面也是调色板模式才能使用这


    delete  quad;
}
//bmp文件每行都是以4倍数存储512没有这个问题
bmpb= char[t];

bmpf.seekg((bmpfilehdr)+bmpfh.biSize,ios::beg);//跳到数据区

bmpf.read(bmpb,t));
bmpf.close;

//注意读入图象深度应和表面深度相同否则这里就要进行格式转换(这里就不

讲了)
DDSURFACEDESC2 desc;
  ZeroMemory( &desc, (desc) );
  desc.dwSize = (desc);
  HRESULT r=surf->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 );
   (rDDERR_SURFACELOST){surf->Restore;;}

  BYTE*surfbits=(BYTE*)desc.lpSurface;
  BYTE *rc=bmpb+t;//到缓冲区最后
   i;
  for(i=0;i<bmpfh.biHeight;i)
  {
        rc-=bmpfh.biWidth*(bmpfh.biBitCount/3);//bmp是倒过来存储所以要从最后

行开始复制;
    memcpy(surfbits,rc,bmpfh.biWidth*(bmpfh.biBitCount/3));
    surfbitsdesc.lPitch;//表面跨度般不等于图像宽度
  }
  surf->Unlock( 0 );
Tags:  directdrawerror directdraw不可用 directdraw加速 directdraw

延伸阅读

最新评论

发表评论