Bmp格式與程式設計讀取解析

2021-09-24 03:08:10 字數 2812 閱讀 6006

影象載入函式,通過bmp路徑,載入影象資料,通過類建構函式來實現

digitalimage::digitalimage(lpctstr lpszpath)

// 為位**件頭分配空間,並初始化為0

m_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))

if (m_lpbmpfileheader->bftype == 0x4d42)// 判斷此檔案是不是位**件(「0x4d42」代表「bm」)

}// 計算顏色表長度

dword dwrgbquadlength = 0;

if (m_lpbmpinfoheader->biclrused > 256)

dwrgbquadlength = 0;

else

dwrgbquadlength = m_lpbmpinfoheader->biclrused * sizeof(rgbquad);

// 設定位圖資料指標

m_lpdata = m_lpnotbmpfilehenderdata + m_lpbmpinfoheader->bisize + dwrgbquadlength;

// 判斷是否有顏色表

if (m_lprgbquad == (lprgbquad)m_lpdata)

else

// 申請緩衝區,初始化為0

dword dwsize = 2 * sizeof(word) + m_lpbmpinfoheader->biclrused * sizeof(paletteentry);

lplogpalette lplogpalette = (lplogpalette) new byte[dwsize];

memset(lplogpalette, 0, dwsize);

// 生成邏輯調色盤

lplogpalette->palversion = 0x300;

lplogpalette->palnumentries = m_lpbmpinfoheader->biclrused;

lprgbquad lprgbquad = (lprgbquad)m_lprgbquad;

for (int i = 0; i < m_lpbmpinfoheader->biclrused; i++)

// 建立邏輯調色盤

m_hpalette = createpalette(lplogpalette);

// 釋放緩衝區

delete lplogpalette;

// 設定位圖大小(因為很多位**件都不設定此項)

if (m_lpbmpinfoheader->bisizeimage == 0)

// 位圖有效

m_bvalid = true;

} }else

}

2.的顯示,通過兩種方式顯示,通過stretchdibits函式;

bool digitalimage::draw(cdc *pdc, cpoint origin, csize size)

// 舊的調色盤控制代碼

hpalette holdpalette = null;

// 如果位圖指標為空,則返回false

if (m_lpnotbmpfilehenderdata == null)

// 如果點陣圖有調色盤,則選進裝置環境中

if (m_hpalette != null)

// 設定位圖伸縮模式

pdc->setstretchbltmode(coloroncolor);

// 將位圖在pdc所指向的裝置上進行顯示

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);

// 恢復舊的調色盤

if (holdpalette != null)

return true;

}

3.通過setpixel逐畫素顯示。

bool digitalimage::drawpixel(cdc * pdc, cpoint origin)

} return true;

}

4.執行結果:

對於逐畫素顯示的函式,顏色資料解析存在不足,顯示如下,對於存在的錯誤,還需繼續專研。

bmp格式解析

寫這 時,出現的錯誤 1.忘了on wm paint 一直在介面上畫不出來 找了好久 2.正確寫法 byte pbits byte lpbase pbitmapfileheader bfoffbits 寫成了byte pbits pbitmapfileheader bfoffbits cpp inc...

讀取BMP格式資料

pragma once include class digitalimage 還需要計算顏色表的位元組長度啊,用於定位畫素位置,難道不是顏色數嗎?no.dword rgblen size sizeof rgbquad 我還以為是這樣,size 4 畫素資料指標,怎麼計算 m lpbmpdata m ...

Bmp檔案格式解析

1.bmp檔案組成。bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。檔案頭主要包含檔案的大小 檔案型別 影象資料偏離檔案頭的長度等資訊 位圖資訊頭包含圖象的尺寸資訊 影象用幾個位元數值來表示乙個畫素 影象是否壓縮 影象所用的顏色數等資訊。顏色資訊包含影象所用到的顏色表,顯示影象時需用到...