最近需要在BMP位圖顯示時,需要在影像上畫出ROI區域,嘗試著用雙緩沖繪圖,但是畫筆顏色設定無效,代碼如下:
void COpenCloseDlg::OnBnClickedButton1()
{
CDC* m_picDC=GetDlgItem(IDC_STATIC_PIC)->GetDC();
CDC m_dcMemory;
m_dcMemory.CreateCompatibleDC(m_picDC);
FILE* fp;
fp=fopen("C:\\Users\\t\\Desktop\\lena.raw","rb");
fread(ImgData,sizeof(BYTE),65536,fp);
fclose(fp);
HBITMAP hbmp=CreateDIBSection(NULL,m_pBmpInfoGray,DIB_RGB_COLORS,(VOID**)&DIBdata,NULL,0);
memcpy(DIBdata,ImgData,256*256);
CBitmap BmpCompatible;
BmpCompatible.Attach(hbmp); //CBitmap物件與HBITMAP相關聯
CBitmap* pOldBitmap=m_dcMemory.SelectObject(&BmpCompatible); //兼容DC選入位圖
CRect rect;
m_PIC.GetClientRect(&rect); //m_PIC為靜態控制元件關聯的變數
int w=rect.Width();
int h=rect.Height();
CClientDC dc(FromHandle(m_PIC.m_hWnd));
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=m_dcMemory.SelectObject(pBrush);
CPoint m_StartPoint(10,10);
CPoint pointControl(50,50);
CRect rc(m_StartPoint,pointControl);
rc.NormalizeRect();
CPen pen(PS_SOLID,2,RGB(255,255,0));
CPen* pOldPen=m_dcMemory.SelectObject(&pen);
m_dcMemory.Rectangle(&rc);
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&m_dcMemory,0,0,256,256,SRCCOPY);
m_dcMemory.SelectObject(pOldBitmap);
m_dcMemory.SelectObject(pOldBrush);
BmpCompatible.DeleteObject();
}
顯示效果如下:
http://img.my.csdn.net/uploads/201609/11/1473597613_3467.JPG
圖片上傳各種失敗,只好用下超鏈接

矩形框是灰色的
但是略加改變,顯示效果正常,代碼如下:
void COpenCloseDlg::OnBnClickedButton1()
{
CDC* m_picDC=GetDlgItem(IDC_STATIC_PIC)->GetDC();
CDC m_dcMemory;
m_dcMemory.CreateCompatibleDC(m_picDC);
FILE* fp;
fp=fopen("C:\\Users\\t\\Desktop\\lena.raw","rb");
fread(ImgData,sizeof(BYTE),65536,fp);
fclose(fp);
HBITMAP hbmp=CreateDIBSection(NULL,m_pBmpInfoGray,DIB_RGB_COLORS,(VOID**)&DIBdata,NULL,0);
memcpy(DIBdata,ImgData,256*256);
CBitmap BmpCompatible;
BmpCompatible.Attach(hbmp); //CBitmap物件與HBITMAP相關聯
CBitmap* pOldBitmap=m_dcMemory.SelectObject(&BmpCompatible); //兼容DC選入位圖
CRect rect;
m_PIC.GetClientRect(&rect); //m_PIC為靜態控制元件關聯的變數
int w=rect.Width();
int h=rect.Height();
CClientDC dc(FromHandle(m_PIC.m_hWnd));
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=dc.SelectObject(pBrush);
CPoint m_StartPoint(10,10);
CPoint pointControl(50,50);
CRect rc(m_StartPoint,pointControl);
rc.NormalizeRect();
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&m_dcMemory,0,0,256,256,SRCCOPY);
CPen pen(PS_SOLID,2,RGB(255,255,0));
CPen* pOldPen=dc.SelectObject(&pen);
dc.Rectangle(&rc);
dc.SelectObject(pOldBrush);
BmpCompatible.DeleteObject();
}
圖片顯示如下:
http://img.my.csdn.net/uploads/201609/11/1473597613_6242.JPG
不明白問題原因出在哪,求各位幫忙解釋下?
uj5u.com熱心網友回復:
1、畫筆改成指標型,用CreatePen來創建;2、創建畫筆時放在Dlg 創建函式里或初始化函式里,以防資源反復創建和釋放。
uj5u.com熱心網友回復:
HDC hdc = ::GetDC(hWnd);
HPEN hPen,hOldPen; //畫筆
hPen = CreatePen(PS_SOLID, 2, RGB(255,0,0));//生成紅色色畫筆 畫筆寬度5個像素
hOldPen = (HPEN)SelectObject(hdc, hPen);//把畫筆引入設備場境
Arc(hdc, xx - GJZ, yy - GJZ, xx + GJZ, yy + GJZ, xx, yy, xx, yy);//機械中心250范圍
SelectObject(hdc, hOldPen);
DeleteObject(hPen);
uj5u.com熱心網友回復:
m_pBmpInfoGray 的問題 ?參考:
void CShow256BmpDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
CDC memDC;
CBitmap bitmap;
CBitmap bitmap1;
HBITMAP hBitmap;
CBitmap *pOldBitmap;
DWORD len;
memDC.CreateCompatibleDC(&dc);
// 8bit
bitmap.LoadBitmap(IDB_MY_BITMAP1);// 8bit "girl8.bmp"
BITMAP bm={0};
bitmap.GetBitmap(&bm);
int ImageSize=bm.bmWidthBytes * bm.bmHeight;
BYTE *pImageIn=new BYTE[ImageSize];
memset(pImageIn,0,ImageSize);
len=bitmap.GetBitmapBits(ImageSize,pImageIn);
// use: CreateDIBSection
BITMAPINFO bmInfo;
bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth=bm.bmWidth;
bmInfo.bmiHeader.biHeight=-bm.bmHeight;// should '-' !!!!
bmInfo.bmiHeader.biPlanes=1;
bmInfo.bmiHeader.biBitCount=bm.bmBitsPixel;// =32 !!!!
bmInfo.bmiHeader.biCompression=BI_RGB;
bmInfo.bmiHeader.biSizeImage=ImageSize;
bmInfo.bmiHeader.biXPelsPerMeter=0;
bmInfo.bmiHeader.biYPelsPerMeter=0;
bmInfo.bmiHeader.biClrUsed=0;
bmInfo.bmiHeader.biClrImportant=0;
void* tempArray=NULL;
hBitmap=::CreateDIBSection(dc.m_hDC, (BITMAPINFO*)&bmInfo,DIB_RGB_COLORS,&tempArray,NULL,0);
memcpy(tempArray,pImageIn,ImageSize);
pOldBitmap=(CBitmap *)memDC.SelectObject(hBitmap);
// draw a rectangle in memDC
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=memDC.SelectObject(pBrush);
CPoint m_StartPoint(10,10);
CPoint pointControl(50,50);
CRect rc(m_StartPoint,pointControl);
rc.NormalizeRect();
CPen pen(PS_SOLID,2,RGB(255,255,0));
CPen* pOldPen=memDC.SelectObject(&pen);
memDC.Rectangle(&rc);
// output
dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY);
// release
delete [] pImageIn;
}
uj5u.com熱心網友回復:
下面是 讀 ”dib”
// dib
void CShow256BmpDlg::OnButton2()
{
// get bmp info, b.o "*.dib" no info in it.
fstream bmpfile;
const char* bmpfilename = "girl8.bmp";// 256 gray
bmpfile.open(bmpfilename, ios::in|ios::binary);
if(!bmpfile.is_open()) return;
char bmpinfo[40+256*4] = {0};// 定義BITMAPINFO,40位元組的資訊頭+256色的顏色表
bmpfile.seekg(14, ios::beg);// 跳過檔案頭
bmpfile.read(bmpinfo, 1064);// 讀取40位元組的資訊頭+4*256色的顏色
bmpfile.close();
//
int w =((BITMAPINFO*)bmpinfo)->bmiHeader.biWidth;
int h = ((BITMAPINFO*)bmpinfo)->bmiHeader.biHeight;
// read from ".dib""
fstream ibmpfile;
const char* ibmpfilename = "girl8.dib";
ibmpfile.open(ibmpfilename, ios::in|ios::binary);
char* bmpdata = new char[w*h];
ibmpfile.read(bmpdata, w*h);//讀取位圖資料
ibmpfile.close();
//draw dib into memDC
CClientDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
// Select a compatible bitmap into the memory DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, w, h);
memDC.SelectObject(&bitmap);
SetDIBitsToDevice(memDC.m_hDC, 0, 0, w, h, 0, 0, 0, h, bmpdata, (BITMAPINFO*)bmpinfo, DIB_RGB_COLORS);
delete [] bmpdata;
// draw a rectangle in memDC
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=memDC.SelectObject(pBrush);
CPoint m_StartPoint(10,10);
CPoint pointControl(50,50);
CRect rc(m_StartPoint,pointControl);
rc.NormalizeRect();
CPen pen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=memDC.SelectObject(&pen);
memDC.Rectangle(&rc);
// output
dc.BitBlt(0,0,w,h,&memDC,0,0,SRCCOPY);
}
注意使用
SetDIBitsToDevice(memDC.m_hDC, 0, 0, w, h, 0, 0, 0, h, bmpdata, (BITMAPINFO*)bmpinfo, DIB_RGB_COLORS);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/126467.html
標籤:界面
