SetPixel去显示BMP图

最近学习一下图形的知识,一直对位图不太了解,自己开发当中一般都是直接用CIMage 或者别的图形类来进行图形处理,一些本质东西不知道,总感觉比较虚。因为在一些特殊的环境是需要这些知识。

知识引用:

http://binge518.blog.51cto.com/1554719/1169618

http://blog.csdn.net/dijkstar/article/details/20854709

http://wenku.baidu.com/link?url=roYEAkwLC96-dP-X8Tsd8Tzwn11ek0kVZUvqMmeluzpFFJ-M7VjePh2It51webVq44mLk7poCTfxA7FkkXUR7_BunmRRz4QJ_05nCNgGibO


上面3个资料已经比较清晰了,但我不习惯上面那种每行4字节对齐的写法,感觉挺别扭,不直接。

然后我看windows图形编程 这本经典的图形书籍,里面的封装类写法,如是简单写了一下面的测试代码。

最好看一下作者原来封装类。

//自己简单写一个显示24位BMP的显示

void CMFCTESTTEMPDlg::ShowMyBmp()
{
	FILE *fp=NULL; 
	int ret = fopen_s(&fp,"D:\\11.bmp","rb"); 
	if(fp==0)    
	{ 
		return ; 
	} 
	BITMAPFILEHEADER fileheader={0}; 
	fread(&fileheader,sizeof(fileheader),1,fp); 
	if(fileheader.bfType!=0x4D42) 
	{ 
		fclose(fp); 
		return ; 
	} 

	BITMAPINFOHEADER head; 
	fread(&head,sizeof(BITMAPINFOHEADER),1,fp);  
	long bmpWidth = head.biWidth; 
	long bmpHeight = head.biHeight; 
	WORD biBitCount = head.biBitCount; 
	if(biBitCount != 24) 
	{ 
		::AfxMessageBox(_T("请选择24位位图!")); 
		fclose(fp); 
		return ; 
	} 

	int totalSize = head.biSizeImage;
	BYTE *pBmpBuf = new BYTE[totalSize]; 
	size_t size = 0; 
	while(true) 
	{ 
		int iret = fread(&pBmpBuf[size],1,1,fp); 
		if(iret == 0) 
			break; 
		size = size + iret; 
	} 
	fclose(fp); 

	int i,j; 
	CClientDC dc(this); 
	//int pitch=bmpWidth%4; 

	BYTE * m_pBits = pBmpBuf;
	int pich = (bmpWidth*biBitCount + 31)/32*4;		//每一行占用的字节数
	int Delta = bmpHeight ? -pich : pich;
	BYTE* OrgOffset = m_pBits;

	if(Delta < 0 )
	{
		OrgOffset += (abs(bmpHeight) - 1)*pich;
	}

	for(i=0;i<bmpHeight;i++) 
	{ 
		for(j=0;j<bmpWidth;j++) 
		{ 

			//用双缓存速度提高明显
			BYTE* bPix = OrgOffset + Delta*i + j*3;
			DWORD clr = RGB(bPix[2],bPix[1],bPix[0]);
			dc.SetPixel(j,i,clr);
		} 
	} 
	delete [] pBmpBuf;     pBmpBuf = NULL;
	return ; 
}


猜你喜欢

转载自blog.csdn.net/xiaozuoay/article/details/45313295