运行测试效果: 
代码:
<!--<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文件并显示
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文件
}
17万+

被折叠的 条评论
为什么被折叠?



