[轉貼] 載入圖像到 DirectDraw(不用winapi的方法) |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
中國游戲技術資源網 http://www.gameres.com/Visual/2D/LoadBitmap1.htm
作者:udragon
載入圖像到 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; ifstream bmpf(filename,ios::in|ios::binary); BITMAPFILEHEADER bmpfilehdr; bmpf.seekg(sizeof(bmpfilehdr),ios::beg);//bmp文件頭,因為沒有用,直接跳過 bmpf.read((char *)&bmpfh,sizeof(bmpfh));//讀取文件頭 t=bmpfh.biSizeImage; if(t==0) t=((bmpfh.biWidth*(bmpfh.biBitCount/3) 3)&~3)*bmpfh.biHeight;//象素數據大小 (以字節計算) if (bmpfh.biBitCount==8) { int ncolors; if (bmpfh.biClrUsed==0) ncolors=256; else ncolors=bmpfh.biClrUsed; RGBQUAD* quad=new RGBQUAD[ncolors]; bmpf.read( (char*)quad, sizeof(RGBQUAD)*ncolors ); CreatePalette( quad, ncolors );//如果表面也是調色板模式的才能使用這 一句 delete [] quad; } //bmp文件每一行都是以4的倍數存儲,512沒有這個問題 bmpb=new char[t]; bmpf.seekg(sizeof(bmpfilehdr) bmpfh.biSize,ios::beg);//跳到數據區 bmpf.read(bmpb,t)); bmpf.close(); //注意讀入的圖象深度應與表面的深度相同,否則這里就要進行格式轉換(這里就不 講了) DDSURFACEDESC2 desc; ZeroMemory( &desc, sizeof(desc) ); desc.dwSize = sizeof(desc); HRESULT r=surf->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 ); if (r==DDERR_SURFACELOST){surf->Restore();return;} BYTE*surfbits=(BYTE*)desc.lpSurface; BYTE *rc=bmpb t;//到緩衝區最后 int i; for(i=0;i時間就是金錢---[ 發問前請先找找舊文章] 發表人 - axsoft 於 2002/08/15 11:09:13 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |