需要读取图片文件,获得图片的头BITMAPINFOHEADER和数据BYTE*,看了好多例子
整理一下删减后的几种方法。需要注意bmp图像数据的起始位置在左下角,特别是获得Header和Byte后,在用StretchDIBits画图时。见 StretchDIBits说明。
1.只用 CImage
CImage m_imge;
m_image.Load(path);
BITMAPINFOHEADER m_pHeader = new BITMAPINFOHEADER;
memset(m_pHeader, 0, sizeof(BITMAPINFOHEADER));
m_pHeader->biSize = sizeof(BITMAPINFOHEADER);
m_pHeader->biPlanes = 1;
m_pHeader->biWidth =m_image.GetWidth();
m_pHeader->biHeight =m_image.GetHeight();
m_pHeader->biBitCount = m_image.GetBPP();
m_pHeader->biSizeImage = abs(m_image.GetPitch())*m_image.GetHeight();
if (m_image.GetPitch() < 0) //有的图片如jpg是从左上角,而bmp图片是从左下角开始的
m_pData = (BYTE *)m_image.GetBits() + (m_image.GetPitch()*(m_image.GetHeight() - 1));
else
m_pData = (BYTE *)m_image.GetBits();
2.用HBITMAP和BITMAP只能读取bmp图片
HBITMAP hbmp = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), (void *)&bmp); BITMAPINFOHEADER m_pHeader = new BITMAPINFOHEADER;
memset(m_pHeader, 0, sizeof(BITMAPINFOHEADER));
m_pHeader->biSize = sizeof(BITMAPINFOHEADER);
m_pHeader->biWidth = bmp.bmWidth;
m_pHeader->biHeight = bmp.bmHeight;
m_pHeader->biPlanes = bmp.bmPlanes;
m_pHeader->biBitCount = bmp.bmBitsPixel*(WORD)bmp.bmPlanes;
m_pHeader->biSizeImage = bmp.bmWidthBytes*bmp.bmHeight;
BYTE* m_pData = new BYTE[bmp.bmWidthBytes*bmp.bmHeight];
HDC dc =::GetDC(NULL);
GetDIBits(dc, hbmp, 0, bmp.bmHeight, m_pData, (BITMAPINFO*)m_pHeader, DIB_RGB_COLORS);
3. 用HBITMAP和CBitmap只能读取bmp图片
HBITMAP hbmp = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), (void *)&bmp);
BITMAPINFOHEADER *m_pHeader = new BITMAPINFOHEADER;
memset(m_pHeader, 0, sizeof(BITMAPINFOHEADER));
m_pHeader->biSize = sizeof(BITMAPINFOHEADER);
m_pHeader->biWidth = bmp.bmWidth;
m_pHeader->biHeight = bmp.bmHeight;
m_pHeader->biPlanes = bmp.bmPlanes;
m_pHeader->biBitCount = bmp.bmBitsPixel*(WORD)bmp.bmPlanes;
m_pHeader->biSizeImage = bmp.bmWidthBytes*bmp.bmHeight;
BYTE*m_pData = new BYTE[bmp.bmWidthBytes*bmp.bmHeight];
Cbitmap cbmp;cbmp.Attach(hbmp);
DWORD n = cbmp.GetBitmapBits(m_pHeader->biSizeImage, m_pData);
StretchDIBits说明:
来自 <http://blog.csdn.net/hczhiyue/article/details/6264115>
int StretchDIBits(HDC hdc, int XDest, int YDest , int nDestWidth, int nDestHeight, int XSrc,
int Ysrc, intnSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo,UINT iUsage, DWORD dwRop)
hdc:指向目标设备环境的句柄。
XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。
YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nDestWidth:指定目标矩形的宽度。为正时绘制区域在XDest的右边,绘制方向从左到右;为负时向绘制区域在XDest的左边,绘制方向从右到左。
nDestHeight:指定目标矩形的高度。为正时绘制区域在YDest的下方,但是绘制方向从下到上;为负时绘制区域在YDest的上方,但是绘制方向从上到下。
XSrc:指定DIB中源矩形(左下角)的X轴坐标(不管biHeight为正或负),坐标以像素点表示。
YSrc:指定DIB中源矩形(左下角)的Y轴坐标(不管biHeight为正或负),坐标以像素点表示。
nSrcWidth:按像素点指定DIB中源矩形的宽度,为正时选择区域在XSrc的右边,扫描方向从左到右;为负时选择区域在XSrc的左边,扫描方向从右到左。
nSrcHeight:按像素点指定DIB中源矩形的高度,为正时选择区域在YSrc的上方,扫描方向从下到上;为负时选择区域在YSrc的下方,扫描方向从上到下。
先扫描行,后扫描列。
lpBits:指向DIB位的指针,这些位的值按字节类型数组存储。
lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。
iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB值或索引。