我这个程序打开BMP文件后显示的时候出现失真的现象,请哪位好心人帮我看看,哪里不对!! 万分感激!!!
在网上查了好多,但都没有成功!!
void CVcldbmpcDlg::OnButton1() //这是打开BMP文件的函数
{
 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 //----------------------------------------■ここから追加
 CString filename;
 CFile file;
 BITMAPINFOHEADER myBmpInfoHdr;
 BITMAPFILEHEADER myBmpFileHdr;
 g_hWnd = m_hWnd;
 if(g_hThread != NULL)return ;//スレッドが起動しているときは動作しない。
 flagT=0;
 // ファイルダイアログを表示してファイル指定する
 CFileDialog myDLG(TRUE,NULL,NULL,
  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  "ビットマップ(*.BMP)|*.BMP||");
 if(myDLG.DoModal()!=IDOK) return;
 // 取得したファイルをオープンする
 filename = myDLG.GetPathName();
 if(!file.Open(filename,CFile::modeRead|CFile::typeBinary))return;
 // タイトルバーにファイル名を表示する
 SetWindowText("vcldbmpc " + filename);
 // ファイルヘッダ部とインフォヘッダ部を読み込む
 file.Read(&myBmpFileHdr,sizeof(BITMAPFILEHEADER));
 file.Read(&myBmpInfoHdr,sizeof(BITMAPINFOHEADER));
 // 前回使用していれば、一旦メモリ解放する
 if(g_BmpInfo){
  Som_del_mem();
  delete[] g_BmpImage4;
  delete[] test_BmpImage;
  delete[] g_BmpImage3;
  delete[] g_BmpImage2;
  delete[] g_BmpImage1;
  delete[] g_BmpImage;
  delete[] g_BmpInfo;
 }
 // 色情報を取得する
 // biBitCountは1ピクセルあたりのカラー表現ビット数
 // 1,4,8,16,24,32がある.数字が大きいほど精細表現が可能
 // 16ビット以上と未満でカラーデータ格納が異なる
 if(myBmpInfoHdr.biBitCount >= 16){
  g_BmpInfo = (LPBITMAPINFO)new char[sizeof(BITMAPINFO)];
 }else{
  g_BmpInfo = (LPBITMAPINFO)new char[sizeof(BITMAPINFOHEADER)+(1<<myBmpInfoHdr.biBitCount)*sizeof(RGBQUAD)];
  file.Read(g_BmpInfo->bmiColors,(1<<myBmpInfoHdr.biBitCount)*sizeof(RGBQUAD));
 }
 // g_BmpInfo(LPBITMAPINFO型)のmyBmpInfoHdrメンバに設定
 g_BmpInfo->bmiHeader = myBmpInfoHdr;
 // ファイル内のビットマップ実データ位置に合わせる
 file.Seek(myBmpFileHdr.bfOffBits,CFile::begin);
 // 実画像データ分のバイト数を確保
 // bfsize ビットマップファイル全サイズ
 // bfOffBits 先頭にあるヘッダ情報サイズ
 g_BmpBufSize= myBmpFileHdr.bfSize - myBmpFileHdr.bfOffBits;
 g_BmpImage4 = new char[g_BmpBufSize];
 test_BmpImage = new char[g_BmpBufSize];
 g_BmpImage  = new char[g_BmpBufSize];
 g_BmpImage1 = new char[g_BmpBufSize];
 g_BmpImage2 = new char[g_BmpBufSize];
 g_BmpImage3 = new char[512*384*sizeof(BYTE )*3];
 Som_new_mem();
 g_hThread=NULL;g_Signal=0;
 // ビットマップ実データを読み込み格納
 file.Read(g_BmpImage,g_BmpBufSize);
 file.Close();
 memcpy(g_BmpImage4,g_BmpImage,g_BmpBufSize);//added by Timli;
 memset(g_BmpImage3,0,512*384*sizeof(BYTE )*3);
 Histgram_Cardinality(g_BmpImage, g_BmpImage3, g_BmpInfo); // 20070903
 //Byte_Histgram_Cardinality(g_BmpImage, g_BmpImage5, g_BmpInfo,1); // 20070903
 
 // 再描画指示
 Invalidate();
 
 //----------------------------------------■ここまで追加 
}
void CVcldbmpcDlg::DrawPict1(void )//这个函数是放在OnPaint()中,把内存中的BMP显示出来!!
{
 HDC   hDC; // デバイスコンテキストのハンドル
 PAINTSTRUCT ps;  // クライアント領域の描画に使う情報を保持
 double  scale; // AutoScaleパラメータ
 scale = 280.0 / g_BmpInfo->bmiHeader.biWidth;
 if( g_BmpInfo->bmiHeader.biHeight * scale >= 210.0)
  scale = 210.0 / g_BmpInfo->bmiHeader.biHeight;
 // 画像の準備ができていなければリターン
 //★ 次の「hDC = ::GetDC(m_hWnd);」を書き直す
 //★ この処理で出力先がピクチャボックスになる
 // hDC = ::GetDC(m_hWnd);  //元の記述
 hDC = m_pict.GetDC()->GetSafeHdc();
 ::BeginPaint(m_hWnd,&ps);
 ::StretchDIBits(hDC,0,0,
  (int )(g_BmpInfo->bmiHeader.biWidth*scale),
  (int )(g_BmpInfo->bmiHeader.biHeight*scale),
  0,0,
  g_BmpInfo->bmiHeader.biWidth,
  g_BmpInfo->bmiHeader.biHeight,
  g_BmpImage,g_BmpInfo,
  DIB_RGB_COLORS,SRCCOPY);
 ::EndPaint(m_hWnd,&ps);
 // オブジェクトの解放など
 ::ReleaseDC(m_hWnd,hDC);
 return ;
}

 
											





 
	     
										
					
	

