最近学习一下图形的知识,一直对位图不太了解,自己开发当中一般都是直接用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 ;
}