日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bmp格式与编程读取解析

發(fā)布時(shí)間:2024/7/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bmp格式与编程读取解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • Bmp格式

  • DigitalImage圖像類設(shè)計(jì)

  • 圖像加載函數(shù),通過bmp圖片路徑,加載圖像數(shù)據(jù),通過類構(gòu)造函數(shù)來實(shí)現(xiàn)。
  • DigitalImage::DigitalImage(LPCTSTR lpszPath) {StrCpy(m_FilePath, lpszPath);CFile RdBmp;if (!RdBmp.Open(m_FilePath, CFile::modeRead | CFile::shareDenyWrite)){return;}// 為位圖文件頭分配空間,并初始化為0m_lpBmpFileHeader = (LPBITMAPFILEHEADER)new BYTE[sizeof(BITMAPFILEHEADER)];memset(m_lpBmpFileHeader, 0, sizeof(BITMAPFILEHEADER));// 讀取位圖文件頭int nCount = RdBmp.Read((void *)m_lpBmpFileHeader, sizeof(BITMAPFILEHEADER));if (nCount != sizeof(BITMAPFILEHEADER)){return;}if (m_lpBmpFileHeader->bfType == 0x4d42)// 判斷此文件是不是位圖文件(“0x4d42”代表“BM”){// 是位圖文件// 計(jì)算除位圖文件頭的空間大小,分配空間并初始化為0DWORD dwDibSize = RdBmp.GetLength() - sizeof(BITMAPFILEHEADER);m_lpNotBmpFileHenderData = new BYTE[dwDibSize];memset(m_lpNotBmpFileHenderData, 0, dwDibSize);// 讀取除位圖文件頭的所有數(shù)據(jù)RdBmp.Read(m_lpNotBmpFileHenderData, dwDibSize);// 關(guān)閉位圖文件RdBmp.Close();// 設(shè)置位圖信息指針m_lpBmpInfo = (LPBITMAPINFO)m_lpNotBmpFileHenderData;// 設(shè)置位圖信息頭指針m_lpBmpInfoHeader = (LPBITMAPINFOHEADER)m_lpNotBmpFileHenderData;// 設(shè)置位圖顏色表指針m_lpRgbQuad = (LPRGBQUAD)(m_lpNotBmpFileHenderData + m_lpBmpInfoHeader->biSize);// 如果位圖沒有設(shè)置位圖使用的顏色數(shù),設(shè)置它if (m_lpBmpInfoHeader->biClrUsed == 0){if (m_lpBmpInfoHeader->biBitCount < 9){UINT dwNumOfColor = (UINT)pow(2, m_lpBmpInfoHeader->biBitCount);m_lpBmpInfoHeader->biClrUsed = dwNumOfColor;}}// 計(jì)算顏色表長度DWORD dwRgbQuadLength = 0;if (m_lpBmpInfoHeader->biClrUsed > 256)dwRgbQuadLength = 0;elsedwRgbQuadLength = m_lpBmpInfoHeader->biClrUsed * sizeof(RGBQUAD);// 設(shè)置位圖數(shù)據(jù)指針m_lpData = m_lpNotBmpFileHenderData + m_lpBmpInfoHeader->biSize + dwRgbQuadLength;// 判斷是否有顏色表if (m_lpRgbQuad == (LPRGBQUAD)m_lpData){m_lpRgbQuad = NULL; // 將位圖顏色表指針置空m_bHasRgbQuad = FALSE; // 無顏色表}else{m_bHasRgbQuad = TRUE; // 有顏色表//刪除舊的調(diào)色板對(duì)象if (m_hPalette != NULL){DeleteObject(m_hPalette);m_hPalette = NULL;}// 申請(qǐng)緩沖區(qū),初始化為0DWORD dwSize = 2 * sizeof(WORD) + m_lpBmpInfoHeader->biClrUsed * sizeof(PALETTEENTRY);LPLOGPALETTE lpLogPalette = (LPLOGPALETTE) new BYTE[dwSize];memset(lpLogPalette, 0, dwSize);// 生成邏輯調(diào)色板lpLogPalette->palVersion = 0x300;lpLogPalette->palNumEntries = m_lpBmpInfoHeader->biClrUsed;LPRGBQUAD lpRgbQuad = (LPRGBQUAD)m_lpRgbQuad;for (int i = 0; i < m_lpBmpInfoHeader->biClrUsed; i++){lpLogPalette->palPalEntry[i].peRed = lpRgbQuad->rgbRed;lpLogPalette->palPalEntry[i].peGreen = lpRgbQuad->rgbGreen;lpLogPalette->palPalEntry[i].peBlue = lpRgbQuad->rgbBlue;lpLogPalette->palPalEntry[i].peFlags = 0;lpRgbQuad++;}// 創(chuàng)建邏輯調(diào)色板m_hPalette = CreatePalette(lpLogPalette);// 釋放緩沖區(qū)delete[] lpLogPalette;// 設(shè)置位圖大小(因?yàn)楹芏辔粓D文件都不設(shè)置此項(xiàng))if (m_lpBmpInfoHeader->biSizeImage == 0){m_lpBmpInfoHeader->biSizeImage = m_lpBmpInfoHeader->biWidth*m_lpBmpInfoHeader->biHeight;}// 位圖有效m_bValid = TRUE;}}else{//非位圖m_bValid = FALSE;} }

    ?

    2.圖片的顯示,通過兩種方式顯示,通過StretchDIBits函數(shù);

    BOOL DigitalImage::Draw(CDC *pDC, CPoint origin, CSize size) {// 位圖無效,無法繪制,返回錯(cuò)誤if (!m_bValid){return FALSE;}// 舊的調(diào)色板句柄HPALETTE hOldPalette = NULL;// 如果位圖指針為空,則返回FALSEif (m_lpNotBmpFileHenderData == NULL){return FALSE;}// 如果位圖有調(diào)色板,則選進(jìn)設(shè)備環(huán)境中if (m_hPalette != NULL){hOldPalette = SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);}// 設(shè)置位圖伸縮模式pDC->SetStretchBltMode(COLORONCOLOR);// 將位圖在pDC所指向的設(shè)備上進(jìn)行顯示StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,0, 0, m_lpBmpInfoHeader->biWidth, m_lpBmpInfoHeader->biHeight, m_lpData, m_lpBmpInfo, DIB_RGB_COLORS, SRCCOPY);// 恢復(fù)舊的調(diào)色板if (hOldPalette != NULL){SelectPalette(pDC->GetSafeHdc(), hOldPalette, TRUE);}return TRUE; }

    3.通過SetPixel逐像素顯示。

    BOOL DigitalImage::DrawPixel(CDC * pDC, CPoint origin) { for (int i = m_lpBmpInfoHeader->biHeight-1; i>=0; i--){for (int j = 0; j < m_lpBmpInfoHeader->biWidth; j++){int index = i*m_lpBmpInfoHeader->biWidth + j;int indexcolor = m_lpData[index];COLORREF color;color = RGB(m_lpRgbQuad[indexcolor].rgbRed, m_lpRgbQuad[indexcolor].rgbGreen, m_lpRgbQuad[indexcolor].rgbBlue);pDC->SetPixel(i, j, color);}}return TRUE; }

    4.運(yùn)行結(jié)果:

    對(duì)于逐像素顯示的函數(shù),顏色數(shù)據(jù)解析存在不足,顯示如下,對(duì)于存在的錯(cuò)誤,還需繼續(xù)專研。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Bmp格式与编程读取解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 九色视频丨porny丨丝袜 | 久久精品国产免费看久久精品 | 波多野结衣国产在线 | 天天谢天天干 | 日韩女同一区二区三区 | 农村妇女愉情三级 | 午夜一级黄色片 | 国产免费久久精品国产传媒 | 九一在线视频 | 免费黄色小视频 | 久久丫精品忘忧草西安产品 | 国产又大又黑又粗免费视频 | 国产精品久久久久久久免费看 | 亚洲最大毛片 | 九九九国产视频 | 污视频网址 | mm131亚洲精品 | 男女调教视频 | 美女一区二区视频 | 美国成人免费视频 | av中文天堂 | 色婷婷国产精品久久包臀 | 免费视频爱爱太爽 | 6080午夜| 午夜精品一区二区三区在线播放 | 国产精品伦一区 | 91欧美精品 | 色小说在线观看 | 久久一区国产 | 人人插人人射 | 精品久久久久一区二区国产 | 国产成人久久精品麻豆二区 | 超黄网站在线观看 | 国产一区网 | 18做爰免费视频网站 | 亚洲精品伊人 | 亚洲精品无码永久在线观看 | 久久精品精品 | 久久亚洲视频 | 亚洲日日骚 | 高清欧美性猛交xxxx黑人猛交 | 成人性免费视频 | 国产精品一区三区 | 亚洲 欧美 精品 | 又黄又免费的网站 | 99久久久久 | 日韩成人免费观看 | 亚州综合网 | 中国字幕av | 亚洲不卡中文字幕无码 | 九九热免费视频 | 好吊操视频这里只有精品 | 国产精品中文在线 | 动漫一区二区三区 | 亚洲少妇一区二区 | 在线免费观看黄色av | h狠狠躁死你h高h | 欧美1级片 | www,日韩| 热久久久久久 | 国产精品乱码一区二区视频 | 日韩高清片 | av免费一区 | 国产精品久久一区二区三区动 | 羽月希奶水一区二区三区 | 国产又黄又大又粗视频 | 色婷婷六月天 | 人妻少妇精品无码专区久久 | 欧美日韩一区二区三区电影 | 成人精品综合 | 91麻豆精品视频 | 国产一级特黄视频 | 日日影院| 一区二区三区久久 | 国产女同在线观看 | 亚洲精品久久 | 国产一区二区视频免费观看 | 国产免费看 | 国产亚洲精品久久久久丝瓜 | 看一级黄色大片 | 美少妇av | 欧美另类在线视频 | 男人天堂手机在线 | 成人午夜看片 | 中文字幕日韩久久 | 国产一区二区三区免费观看视频 | av青青草| 国产精品三级在线观看无码 | 国产一级片麻豆 | 亚洲视频色图 | 国内自拍视频在线播放 | 高清av免费观看 | 亚洲精久 | 中文字幕在线高清 | 不用播放器看av | 91叉叉叉 | 鲁鲁在线 | 日本极品丰满ⅹxxxhd | 久久国产电影 |