`
phinecos
  • 浏览: 342446 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BMP文件的读取

 
阅读更多

运行测试效果:

代码:

<!--<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文件
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics