如題,本人是真·新手,搞了一個小代碼,從外部加載一個256色位位圖并且在picture中顯示。用到SetStretchBltMode進行拉扯最終StretchDIBits顯示,但是結果很奇特,不僅失了真而且還漂移了,問問各位大神這是出了什么幺蛾子???
代碼如下
CString filter;
filter="所有檔案(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter,NULL);
//按下確定按鈕 dlg.DoModal() 函式顯示對話框
if( dlg.DoModal() == IDOK )
{
//打開對話框獲取影像資訊
CString BmpName = dlg.GetPathName(); //獲取檔案路徑名 如D:\pic\abc.bmp
CString EntName = dlg.GetFileExt(); //獲取檔案擴展名
EntName.MakeLower(); //將檔案擴展名轉換為一個小寫字符
if(EntName.Compare(_T("bmp")) == 0)
{
//定義變數存盤圖片資訊
BITMAPINFO *pBmpInfo; //記錄影像細節
BYTE *pBmpData; //影像資料
BITMAPFILEHEADER bmpHeader; //檔案頭
BITMAPINFOHEADER bmpInfo; //資訊頭
CFile bmpFile; //記錄打開檔案
//以只讀的方式打開檔案 讀取bmp圖片各部分 bmp檔案頭 資訊 資料
if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary))
return;
if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
return;
if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
return;
pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
//為影像資料申請空間
memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER)); //
DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
pBmpData = (BYTE*)new char[dataBytes];
bmpFile.Read(pBmpData,dataBytes);
bmpFile.Close();
pBmpInfo->bmiHeader.biBitCount =8;
//顯示影像
CWnd *pWnd=GetDlgItem(IDC_STATIC_PIC); //獲得pictrue控制元件視窗的句柄
CRect rect;
pWnd->GetClientRect(&rect); //獲得pictrue控制元件所在的矩形區域
CDC *pDC=pWnd->GetDC(); //獲得pictrue控制元件的DC
pDC->SetStretchBltMode(WHITEONBLACK);//COLORONCOLOR HALFTONE BLACKONWHITE WHITEONBLACK
StretchDIBits(pDC->GetSafeHdc(),
0,
0,
rect.Width(),
rect.Height(),
0,
0,
bmpInfo.biWidth,
bmpInfo.biHeight,
pBmpData,
pBmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);
}
}
在網上找了很多帖子,可能和pBmpInfo,SetStretchBltMode,DIB_RGB_COLORS,的設定有關,但是試了很久還是沒能解決問題....版主說可以用CImage但是并沒有源檔案........
uj5u.com熱心網友回復:
設定下SetBKMode(TRANSPARENT)試試?uj5u.com熱心網友回復:
8位色及以下位深的Dib圖 正常顯示是需要調色板的 SelectPalettehttp://blog.csdn.net/sjiang2142/article/details/6445082
uj5u.com熱心網友回復:
鏈接的文章看了,理解了其中大致的意思,但是并不會改.......這就很尷尬了...
uj5u.com熱心網友回復:
CStatic + CImage 實作簡單的圖片顯示控制元件uj5u.com熱心網友回復:
SetStretchBltMode(dc.GetSafeHdc(), HALFTONE);轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/91075.html
標籤:基礎類
下一篇:求大神看看此dmp檔案的意思。
