运行测试效果:
代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCMyView::OnReadBmp()
{//读取BMP文件并显示
CDC*pDC=GetDC();
CFileDialogdlg(TRUE);
if(dlg.DoModal()==IDOK)
{//选择要打开的BMP图片
strFilePath=dlg.GetPathName();
}
if(strFilePath=="")
{//取消
return;
}
FILE*fp=fopen(strFilePath,"r");
BITMAPFILEHEADERfileheader;
BITMAPINFOinfo;
fread(&fileheader,sizeof(fileheader),1,fp);
if(fileheader.bfType!=0x4D42)
{//不是BMP位图文件
pDC->TextOut(100,200,"无位图文件请选择位图文件");
fclose(fp);
return;
}
UCHAR*buffer=NULL;
//读位图头部
fread(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
//位图宽度
longwidth=info.bmiHeader.biWidth;
this->width=width;
//位图高度
longheight=info.bmiHeader.biHeight;
this->height=height;
DWORDsize;
if(info.bmiHeader.biSizeImage!=0)
{//带颜色表
size=info.bmiHeader.biSizeImage;
}
else
{//不带颜色表的
size=info.bmiHeader.biHeight*info.bmiHeader.biWidth*3;
}
buffer=newUCHAR[size];//分配缓冲区
if(buffer==NULL)
{//分配内存失败
delete[]buffer;
return;
}
//忽略头部字节
fseek(fp,fileheader.bfOffBits,0);
fread(buffer,size,1,fp);
inti,j;
#pragmaregion16color
//16色图的解析
if(info.bmiHeader.biBitCount==4)
{
intpitch;
if(width%8==0)
pitch=width;
else
pitch=width+8-width%8;
RGBQUADquad[16];
fseek(fp,fileheader.bfOffBits-sizeof(RGBQUAD)*16,0);
fread(quad,sizeof(RGBQUAD)*16,1,fp);
if(height>0)
{//height>0表示图片颠倒
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
intindex;
if(j%2==0)
index=buffer[(i*pitch+j)/2]/16;
if(j%2==1)
index=buffer[(i*pitch+j)/2]%16;
UCHARr=quad[index].rgbRed;
UCHARg=quad[index].rgbGreen;
UCHARb=quad[index].rgbBlue;
pDC->SetPixel(j,height-i,RGB(r,g,b));
}
}
}
else
{//图片不颠倒
for(i=0;i<0-height;i++)
{
for(j=0;j<width;j++)
{
intindex;
if(j%2==0)
index=buffer[(i*pitch+j)/2]/16;
if(j%2==1)
index=buffer[(i*pitch+j)/2]%16;
UCHARr=quad[index].rgbRed;
UCHARg=quad[index].rgbGreen;
UCHARb=quad[index].rgbBlue;
pDC->SetPixel(j,i,RGB(r,g,b));
}
}
}
}
#pragmaendregion16color
#pragmaregion256color
//256色图的解析
if(info.bmiHeader.biBitCount==8)
{
intpitch;
if(width%4==0)
{
pitch=width;
}
else
{
pitch=width+4-width%4;
}
RGBQUADquad[256];
fseek(fp,fileheader.bfOffBits-sizeof(RGBQUAD)*256,0);
fread(quad,sizeof(RGBQUAD)*256,1,fp);
if(height>0)
{//height>0表示图片颠倒
for(inti=0;i<height;i++)
{
for(intj=0;j<width;j++)
{
intindex=buffer[i*pitch+j];
UCHARr=quad[index].rgbRed;
UCHARg=quad[index].rgbGreen;
UCHARb=quad[index].rgbBlue;
pDC->SetPixel(j,height-i,RGB(r,g,b));
}
}
}
else
{
for(inti=0;i<0-height;i++)
{
for(intj=0;j<width;j++)
{
intindex=buffer[i*pitch+j];
UCHARr=quad[index].rgbRed;
UCHARg=quad[index].rgbGreen;
UCHARb=quad[index].rgbBlue;
pDC->SetPixel(j,i,RGB(r,g,b));
}
}
}
}
#pragmaendregion256color
#pragmaregion24bit
//24位图解析
if(info.bmiHeader.biBitCount==24)
{
intpitch=width%4;
//bgr
if(height>0)
{//height>0表示图片颠倒
for(inti=0;i<height;i++)
{
intrealPitch=i*pitch;
for(intj=0;j<width;j++)
{
UCHARb=buffer[(i*width+j)*3+realPitch];
UCHARg=buffer[(i*width+j)*3+1+realPitch];
UCHARr=buffer[(i*width+j)*3+2+realPitch];
pDC->SetPixel(j,height-i,RGB(r,g,b));
}
}
}
else
{
for(inti=0;i<0-height;i++)
{
intrealPitch=i*pitch;
for(intj=0;j<width;j++)
{
UCHARb=buffer[(i*width+j)*3+realPitch];
UCHARg=buffer[(i*width+j)*3+1+realPitch];
UCHARr=buffer[(i*width+j)*3+2+realPitch];
pDC->SetPixel(j,i,RGB(r,g,b));
}
}
}
}
#pragmaendregion24bit
this->ReleaseDC(pDC);//释放掉绘制上下文
delete[]buffer;//释放缓冲区
fclose(fp);//关闭BMP文件
}
分享到:
相关推荐
读取bmp文件源代码 C++、MFC6.0
读取.bmp文件源代码,VC++工程
mfc实现bmp文件读取mfc实现bmp文件读取mfc实现bmp文件读取mfc实现bmp文件读取mfc实现bmp文件读取
基于vs2005,实现BMP图像文件读取和保存。适合初学者入门。
实现了对位图文件的读取。包括8位 16位32位的位图数据的读取
如何从内存中读取BMP文件格式,用VC6.0进行图像的显示和读取操作。
这是一个读取BMP文件的C++类, 小巧,高效。包括读写两部分。
内含数字图像处理的各种算法(分水岭,模板,边界检测,膨胀腐蚀开闭运算)实现,及以文件映射技术读取bmp文件的相关函数,并且对其进行c++类的封装。内含代码说明文档。想学习数字图像处理,内存映射文件,bmp文件...
读取并显示BMP的例子
这是本人写的有关bmp文件的关于车牌字符的代码,请多多指教!
一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。 BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。...
支持通用格式的BMP文件读取 24比特格式的BMP文件写 比特 , 通用
bmp文件的读取 RGB参数 rgb参数写在文本文档中查看 bmp支持24色和32色
就是用c语言读取一副bmp图像文件的信息头信息
VC++.NET车牌识别、字符分割与归一化处理,图像对象BMP格式,程序将读取车牌的图像信息,归一化图像大小,动态分配存储图片的像素信息的二维数组,找到图像各列,从左列开始
NULL 博文链接:https://yangzhenlin.iteye.com/blog/2068428
易语言BMP文件采样读取缩略图.rar 易语言BMP文件采样读取缩略图.rar 易语言BMP文件采样读取缩略图.rar 易语言BMP文件采样读取缩略图.rar 易语言BMP文件采样读取缩略图.rar 易语言BMP文件采样读取缩略图.rar
一个图像的读出与保存的程序,希望对初学者有所帮助!
简单的读取BMP文件并显示的程序, 真的非常简单, 只能读取非压缩格式的文件.
通过文档可以详细了解到BMP图像的结构与读取方式,详细介绍了BMP文件的文件头、信息头等结构;适合大家学习.