MFC读取图片文件并获得图片头和数据

需要读取图片文件,获得图片的头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值或索引。



 


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页