freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

vc++圖象處理教程-文庫吧

2024-12-24 07:45 本頁面


【正文】 //每一行的字節(jié)數 DWORD ImgSize。 //實際的圖象數據占用的字節(jié)數 //實際用到的顏色數 ,即調色板數組中的顏色個數 DWORD NumColors。 DWORD i。 if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){ MessageBox(hWnd,File c:\\ not found!,Error Message, MB_OK|MB_ICONEXCLAMATION)。 return FALSE。 //打開文件錯誤,返回 } //將 BITMAPFILEHEADER結構從文件中讀出,填寫到 bf中 _lread(hf,(LPSTR)amp。bf,sizeof(BITMAPFILEHEADER))。 //將 BITMAPINFOHEADER結構從文件中讀出,填寫到 bi中 _lread(hf,(LPSTR)amp。bi,sizeof(BITMAPINFOHEADER))。 //我們定義了一個宏 define WIDTHBYTES(i) ((i+31)/32*4)上面曾經 //提到過,每一行的字節(jié)數必須是 4的整倍數,只要調用 //WIDTHBYTES(*)就能完成這一換算。舉一個例 //子,對于 2色圖,如果圖象寬是 31,則每一行需要 31位存儲,合 3個 //字節(jié)加 7位,因為字節(jié)數必須是 4的整倍數,所以應該是 4,而此時的 //biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4,和我們設想的一樣。 //再舉一個 256色的例子,如果圖象寬是 31,則每一行需要 31個字節(jié)存 //儲,因為字節(jié)數必須是 4的整倍數,所以應該是 32,而此時的 //biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32,我們設想的一樣。你可 //以多舉幾個例子來驗證一下 //LineBytes為每一行的字節(jié)數 LineBytes=(DWORD)WIDTHBYTES(*)。 //ImgSize為實際的圖象數據占用的字節(jié)數 ImgSize=(DWORD)LineBytes*。 //NumColors為實際用到的顏色數 ,即調色板數組中的顏色個數 if(!=0) //如果 ,即為實際用到的顏色數 NumColors=(DWORD)。 else //否則,用到的顏色數為 2biBitCount。 switch(){ case 1: NumColors=2。 break。 case 4: NumColors=16。 break。 case 8: NumColors=256。 break。 case 24: NumColors=0。 //對于真彩色圖,沒用到調色板 break。 default: //不處理其它的顏色數,認為出錯。 MessageBox(hWnd,Invalid color numbers!,Error Message, MB_OK|MB_ICONEXCLAMATION)。 _lclose(hf)。 return FALSE。 //關閉文件,返回 FALSE } if(!=(DWORD)(NumColors*sizeof(RGBQUAD)+ sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER))) { //計算出的偏移量與實際偏移量不符,一定是顏色數出錯 MessageBox(hWnd,Invalid color numbers!,Error Message, MB_OK|MB_ICONEXCLAMATION)。 _lclose(hf)。 return FALSE。 //關閉文件,返回 FALSE } =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD)+ImgSize。 //分配內存,大小為 BITMAPINFOHEADER結構長度加調色板 +實際位圖 if((hImgData=GlobalAlloc(GHND,(DWORD) (sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD)+ ImgSize)))==NULL) { //分配內存錯誤 MessageBox(hWnd,Error alloc memory!,ErrorMessage,MB_OK| MB_ICONEXCLAMATION)。 _lclose(hf)。 return FALSE。 //關閉文件,返回 FALSE } //指針 lpImgData指向該內存區(qū) lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData)。 //文件指針重新定位到 BITMAPINFOHEADER開始處 _llseek(hf,sizeof(BITMAPFILEHEADER),SEEK_SET)。 //將文件內容讀入 lpImgData _hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER) +(long)NumColors*sizeof(RGBQUAD)+ImgSize)。 _lclose(hf)。 //關閉文件 if(NumColors!=0) //NumColors不為零,說明用到了調色板 { //為邏輯調色板分配局部內存,大小為邏輯調色板結構長度加 //NumColors個 PALETTENTRY hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+ NumColors* sizeof(PALETTEENTRY))。 //指針 pPal指向該內存區(qū) pPal =(LOGPALETTE *)LocalLock(hPal)。 //填寫邏輯調色板結構的頭 pPalpalNumEntries = NumColors。 pPalpalVersion = 0x300。 //lpRGB指向的是調色板開始的位置 lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER))。 //填寫每一項 for (i = 0。 i NumColors。 i++) { pPalpalPalEntry[i].peRed=lpRGBrgbRed。 pPalpalPalEntry[i].peGreen=lpRGBrgbGreen。 pPalpalPalEntry[i].peBlue=lpRGBrgbBlue。 pPalpalPalEntry[i].peFlags=(BYTE)0。 lpRGB++。 //指針移到下一項 } //產生邏輯調色板, hPalette是一個全局變量 hPalette=CreatePalette(pPal)。 //釋放局部內存 LocalUnlock(hPal)。 LocalFree(hPal)。 } //獲得設備上下文句柄 hDc=GetDC(hWnd)。 if(hPalette) //如果剛才產生了邏輯調色板 { //將新的邏輯調色板選入 DC,將舊的邏輯調色板句柄保存在 //hPrevPalette hPrevPalette=SelectPalette(hDc,hPalette,FALSE)。 RealizePalette(hDc)。 } //產生位圖句柄 hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS)。 //將原來的調色板 (如果有的話 )選入設備上下文句柄 if(hPalette amp。amp。 hPrevPalette) { SelectPalette(hDc,hPrevPalette,FALSE)。 RealizePalette(hDc)。 } ReleaseDC(hWnd,hDc)。 //釋放設備上下文 GlobalUnlock(hImgData)。 //解鎖內存區(qū) return TRUE。 //成功返回 } 對上面的程序要說明兩點: (1) 對于需要調色板的圖,要想正確地顯示,必須根據 bmp 文件,產生邏輯調色板。產生的方法是:①為邏輯調色板指針分配內存,大小為邏輯調色板結構 (LOGPALETTE)長度加NumColors 個 PALETTENTRY 大小 (調色板的每一項都是一個 PALETTEENTRY 結構 );②填寫邏輯調色板結構的頭 pPalpalNumEntries = NumColors。 pPalpalVersion = 0x300;③從文件中讀取調色板的 RGB 值,填寫到每一項中;④產生邏輯調色板:hPalette=CreatePalette(pPal)。 (2) 產生位圖 (BITMAP)句柄,該項工作由函數 CreateDIBitmap來完成。 hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS)。 CreateDIBitmap 的作用是產生一個和 Windows 設備無關的位圖。該函數的第一項參數為設備上下文句柄。如果位圖用到了調色板,要在調用 CreateDIBitmap 之前將邏輯調色板選入該設備上下文中,產生 hBitmap后,再把原調色板選入該設備上下文中,并釋放該上下文;第二項為指向 BITMAPINFOHEADER的指針;第三項就用常量 CBM_INI,不用考慮;第四項為指向調色板的指針;第五項為指向 BITMAPINFO(包括 BITMAPINFOHEADER,調色板 ,及實際的圖象數據 )的指針;第六項就用常量 DIB_RGB_COLORS,不用考慮。 上面提到了設備上下文,相信編過 Windows 程序的讀者對它并不陌生,這里再簡單介紹一下。 Windows 操作系統(tǒng)統(tǒng)一管理著諸如顯示,打印等操作,將它們看作是一個個的設備,每一個設備都有一個復雜的數據結構來維護。所謂設備上下文就是指這個數據結構。然而,我們不能直接和這些設備上下文打交道,只能通過引用標識它的句柄 (實際上是一個整數 ),讓 Windows去做相應的處理。 產生的邏輯調 色板句柄 hPalette和位圖句柄 hBitmap 要在處理 WM_PAINT消息時使用,這樣才能在屏幕上顯示出來,處理過程如下面的程序。 Static HDC hDC,hMemDC。 PAINTSTRUCT ps。 case WM_PAINT: { hDC = BeginPaint(hwnd, amp。ps)。 //獲得屏幕設備上下文 if (hBitmap) //hBitmap一開始是 NULL,當不為 NULL時表示有圖 { hMemDC = CreateCompatibleDC(hDC)。 //建立一個內存設備上下文 if (hPalette) //有調色板 { //將調色板選入屏幕設備上下文 SelectPalette (hDC, hPalette, FALSE)。 //將調色板選入內存設備上下文 SelectPalette (hMemDC, hpalette, FALSE)。 RealizePalette (hDC)。 } //將位圖選入內存設備上下文 SelectObject(hMemDC, hBitmap)。 //顯示位圖 BitBlt(hDC, 0, 0, , , hMemDC, 0, 0, SRCCOPY)。 //釋放內存設備上下文 DeleteDC(hMemDC)。 } //釋放屏幕設備上下文 EndPaint(hwnd, amp。ps)。 break。 } 在上面的程序中,我們調用 CreateCompatibleDC 創(chuàng)建一個內存設備上下文。 SelectObject函數將與設備無關的位圖選入內存設備上下文中。然后我們調用
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1