| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 666 人关注过本帖
标题:[求助]关于VC显示BMP文件的问题
取消只看楼主 加入收藏
lizhaoshi
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-4-13
收藏
 问题点数:0 回复次数:0 
[求助]关于VC显示BMP文件的问题

我这个程序打开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 ;
}

搜索更多相关主题的帖子: BMP 文件 
2007-10-05 08:40
快速回复:[求助]关于VC显示BMP文件的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017056 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved