VC學習筆記:圖像顯示

原理方法

  • 用圖片作爲畫刷
HBITMAP hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
HBRUSH hBrush = CreatePatternBrush(hBitmap);
HBRUSH holdBrush =(HBRUSH)::SelectObject(hdc,hBrush);
    Rectangle(hdc,0,0,100,100);
//FillRect(hdc,&rc,hBrush);
SelectObject(hdc,holdBrush);
DeleteObject(hBitmap);
DeleteObject(hBrush);
  • 顯示資源中的圖片

(1)從資源中裝入位圖

● 定義位圖對象數據成員CBitmap m_Bitmap;

● 調用CBitmap成員函數LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);

● 傳入LoadBitmap的參數是位圖在圖形編輯器中生成或從位圖文件中引入時賦予的識別符。

(2)生成與位圖相聯繫的內存設備情境對象

CDC MemDC;

MemDC.CreateCompatibleDC(NULL);

MemDC.SelectObject(&m_Bitmap);

(3)顯示位圖

CClientDC ClientDC(this);

BITMAP BM;

m_Bitmap.GetObject(sizeof(BM),&BM);

ClientDC.BitBlt ( X,Y, //目標設備邏輯橫、縱座標

BM.bmWidth, BM.bmHeight, //顯示位圖的像素寬、高度

&MemDC, //待顯示位圖數據的設備情境對象

0,0, //源數據中的橫、縱座標

SRCCOPY); //位操作方式

特點:這種方法顯示位圖速度快,但不是很靈活,而且會使可執行文件增大。

 

  • 顯示磁盤中的圖片

步驟:

HBITMAP *hBitmap; //定義位圖對象句柄

BITMAP BM;

CDC MemDC;

CClientDC ClientDC(this);

MemDC.CreateCompatibleDC(&ClientDC);

hBitmap=(HBITMAP*):: LoadImage ( AfxGetInstanceHandle(), //取得應用程序句柄

“demo1.bmp”, //位圖文件名

IMAGE_BITMAP, //類型爲Windows位圖

0,0, LR_LOADFROMFILE); //從文件中取位圖數據

MemDC.SelectObject(hBitmap);

:: GetObject(hBitmap,sizeof(BM),&BM);

ClientDC.BitBlt(……) //使用格式與方法一同

特點:這種方法顯示位圖速度較之前一種慢了一點,但其靈活性較大,可以任意變換位圖文件,而無需重新編譯源程序, 也減小了可執行文件的大小。

 

 

程序模板

  • 顯示資源中的圖片/在設備上下文中繪製圖像[1]

法一

void COutputBmpView::OnDraw(CDC* pDC)

{

COutputBmpDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CDC memDC;//定義一個設備上下文

memDC.CreateCompatibleDC(pDC);//獲取兼容的設備上下文

CBitmap bmp;

bmp.LoadBitmap(IDB_BKBITMAP);

memDC.SelectObject(&bmp);//選中位圖對象

pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//繪製位圖

CRect rc(30,20,210,200);

CBrush brush(RGB(0,0,0));

pDC->FrameRect(rc,&brush);//繪製矩形邊框

rc.OffsetRect(220,0);//移動區域

BITMAP BitInfo;

bmp.GetBitmap(&BitInfo);

int x = BitInfo.bmWidth;

int y = BitInfo.bmHeight;

pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//繪製位圖

pDC->FrameRect(rc,&brush);

brush.DeleteObject();

memDC.DeleteDC();//釋放設備上下文

bmp.DeleteObject();//釋放文圖對象

}

 

  • 在磁盤中加載圖像到窗口中[1]

CLoadBmpView::CLoadBmpView()//構造函數中

{

m_hBmp = LoadImage(NULL,"Demo.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//加載位圖

}

void CLoadBmpView::OnDraw(CDC* pDC)

{

CLoadBmpDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CBitmap bmp;

bmp.Attach(m_hBmp);//將位圖關聯到位圖句柄上

CDC memDC;

memDC.CreateCompatibleDC(pDC);//創建兼容的設備上下文

memDC.SelectObject(&bmp);//選中位圖對象

BITMAP BitInfo;                                                                        //定義位圖結構

bmp.GetBitmap(&BitInfo);                                                                //獲取位圖信息

int x = BitInfo.bmWidth;                                                                //獲取位圖寬度

int y = BitInfo.bmHeight;                                                                //獲取位圖高度

pDC->BitBlt(0,0,x,y,&memDC,0,0,SRCCOPY);//向窗口中繪製位圖

bmp.Detach();//分離位圖句柄

memDC.DeleteDC();//釋放設備上下文

}

  • 根據位圖數據直接繪圖[1]

char *m_pBmpData;//①在視圖類中定義一個緩衝區

COutputStreamView::COutputStreamView()//②構造函數中讀取文件到數據流中

{

CFile file;//定義文件對象

file.Open("bk.bmp",CFile::modeReadWrite);

int len = file.GetLength();

file.Seek(14,CFile::begin);        //*過位圖文件頭

m_pBmpData = new char[len-14];//爲緩衝區分配空間

file.Read(m_pBmpData,len-14);//讀取文件數據到緩衝區

file.Close();

}

COutputStreamView::~COutputStreamView()//③析構函數中釋放緩衝區

{

delete [] m_pBmpData;

}

void COutputStreamView::OutputStream(char *pStream)//④添加的成員函數,用來根據數據流輸出圖像

{

char *pHeader =pStream ;//定義臨時緩衝區

BITMAPINFO BitInfo;

memset(&BitInfo,0,sizeof(BITMAPINFO));//初始化位圖信息對象

memcpy(&BitInfo,pHeader,sizeof(BITMAPINFO));//爲位圖信息對象賦值

int x = BitInfo.bmiHeader.biWidth;

int y = BitInfo.bmiHeader.biHeight;

pHeader+=40;//指向位圖數據

StretchDIBits(GetDC()->m_hDC,0,0,x,y,0,0,x,y,pHeader,&BitInfo,DIB_RGB_COLORS,SRCCOPY);

}

void COutputStreamView::OnDraw(CDC* pDC)//⑥繪製圖像

{

COutputStreamDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

OutputStream(m_pBmpData);//輸出位圖

}

 

  • 顯示JPEG圖像[1]

①向視圖類添加成員變量

IStream *m_pStream;                                        //定義流對象

IPicture *m_pPicture;                                //定義接口對象

OLE_XSIZE_HIMETRIC m_JPGWidth;                //圖像寬度

OLE_YSIZE_HIMETRIC m_JPGHeight;                //圖像高度

HGLOBAL hMem;                                                //堆句柄

CShowJPEGView::CShowJPEGView()//②構造函數:從磁盤中加載IPEG位圖到流中

{

CFile file;

file.Open("angell.jpg",CFile::modeReadWrite);

DWORD len = file.GetLength();

hMem = GlobalAlloc(GMEM_MOVEABLE,len);//在堆中分配內存

LPVOID pData = NULL; //定義一個指針對象

pData = GlobalLock(hMem);//鎖定內存區域

file.ReadHuge(pData,len);//讀取圖像數據到堆中

file.Close();//

GlobalUnlock(hMem);//解除對堆得鎖定

CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);//在堆中創建流

OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);//加載圖像

m_pPicture->get_Height(&m_JPGHeight);//獲取圖像高度

m_pPicture->get_Width(&m_JPGWidth);

}

void CShowJPEGView::OnDraw(CDC* pDC)//③繪製JPEG圖像

{

CShowJPEGDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45)

              ,0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL);        //繪製JPEG圖像

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章