したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

バグ報告用

46kazuki:2002/11/18(月) 16:36 ID:q40Lcljw
ちなみに、今の関数です。
誰か、分かる方いれば、修正してやって下さいw

//640*480 24bitcolor 専用
void Draw::SaveToBmp(char *file_name)
{
//現在のディスプレイモードを得る
D3DDISPLAYMODE dmode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dmode);
//バックバッファを格納するサーフェスを作成する。
IDirect3DSurface8* back_buffer;
pD3DDevice->CreateImageSurface(window_x_size,window_y_size,dmode.Format,&back_buffer);
//バックバッファを得る
pD3DDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&back_buffer);
//フォーマット変換後の保存先のサーフェスを作成する
IDirect3DSurface8* bmp_buffer;
pD3DDevice->CreateImageSurface(window_x_size,window_y_size,D3DFMT_R8G8B8,&bmp_buffer);
//dmode.FormatからR8G8B8へフォーマット変換をする
D3DXLoadSurfaceFromSurface(bmp_buffer,NULL,NULL,back_buffer,NULL,NULL,D3DX_DEFAULT,NULL);
//BMPバッファをロックする
D3DLOCKED_RECT locked_buffer;//サーフェスへのポインタとピッチの格納される構造体
bmp_buffer->LockRect(&locked_buffer,NULL,NULL);
//BMPバッファの情報を取得する
unsigned char *p;//BMPバッファへのポインタ
p=(unsigned char *)locked_buffer.pBits;
int pitch;//BMPバッファのピッチ。
//サーフェースの大きさが640*480だとしても、
//実際のメモリ上では、Xサイズは640ではない。
//その、実際のXサイズとの差が、このピッチである。
pitch=locked_buffer.Pitch;
//ファイルを開く
FILE *fp;
fp=fopen(file_name,"w");
//ヘッダの作成

//bfTypeには、"BM"の2バイトが収められています。ファイルを読みこんだ時これを調べて"BM"を確認する必要があります。
//bfSizeはファイルのサイズです。
//bfOffBitsはファイルの先頭からビット配列までのオフセット値が入ります。

BITMAPFILEHEADER bmph;
char *c;
c=(char *)&bmph.bfType;
*c='B';c++;
*c='M';
bmph.bfSize=640*480*3+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmph.bfReserved1=0;
bmph.bfReserved2=0;
bmph.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

//biSizeには、構造体の大きさが入ります。
//biWidthは、ビットマップの幅。
//biHeightは、ビットマップの高さ。
//biPlanesは、プレーンの数ですが1でなくてはいけません。
//biBitCountは、ピクセルあたりの色数を示します。1,4,8,24のいずれかです。
//biCompressionは、圧縮方式を示します。0で圧縮なし。
//biSizeImageは、ビットマップビットのサイズ。圧縮の時のみ必要。
//biXPelsPerMeterは、水平解像度を示します。1メートルあたりのピクセル数。
//biYPelsPerMeterは、垂直解像度を示します。
//biClrUsedは、イメージで使われている色数を示します。
//biClrImportantは、イメージで使われている重要な色の数を示します。
//さて、Windows95ではBITMAPV4HEADER、Windows98ではBITMAPV5HEADERが定義されています。各自で調べてみてください。

BITMAPINFOHEADER info;
info.biSize=sizeof(BITMAPINFOHEADER);
info.biWidth=640;
info.biHeight=480;
info.biPlanes=1;
info.biBitCount=24;
info.biCompression=0;
info.biSizeImage=640*480*3;
info.biXPelsPerMeter=96;
info.biYPelsPerMeter=96;
info.biClrUsed=0;
info.biClrImportant=0;
//ヘッダ書き込み
fwrite(&bmph,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp);
//BMP実データ
for(int y=479;y>=0;y--)
{
for(int x=0;x<640;x++)
{
//BMPバッファを弄ぶ
unsigned char r,g,b;//その座標でのRGB値
unsigned char *adr;//指定したX、Y座標の実アドレス
adr=p+((x+y*640)*3+(pitch-640*3)*y);
b=*(adr+0);
g=*(adr+1);
r=*(adr+2);
fputc(b,fp);
fputc(g,fp);
fputc(r,fp);
}
}
//ファイルを閉じる
fclose(fp);
//BMPバッファをアンロックする
bmp_buffer->UnlockRect();
//バックバッファを開放する
RELEASE(back_buffer);
//BMPバッファを開放する
RELEASE(bmp_buffer);
}




掲示板管理者へ連絡 無料レンタル掲示板