用VC读取BMP图像文件

lemontreelcc 2008-04-14 04:16:20
各位大侠帮帮忙吧!
基于形状特征的图像检索系统首先就要用到这个。
不胜感激!

...全文
1995 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sblt_001 2008-05-20
  • 打赏
  • 举报
回复
void CXXXView::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp) ¦*.bmp"),NULL);
CString fileName;

if(dlg.DoModal()==IDCANCEL)
return ;
fileName=dlg.GetPathName();


CFile bitmapFile;
CFileException fileException;
if(!bitmapFile.Open(fileName,CFile::modeRead,&fileException))
{
TRACE("Can't open file %s,error=%u\n",fileName,fileException.m_cause);
}

m_pBmpFileHeader=(BITMAPFILEHEADER*) new char [sizeof(BITMAPFILEHEADER)];//给文件信息头分配内存
bitmapFile.Read(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));//读入文件信息头信息

m_pBmpInfoHeader=(BITMAPINFOHEADER*) new char [sizeof(BITMAPINFOHEADER)];//给BMP信息头分配内存
bitmapFile.Read(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER));

if(m_pBmpFileHeader->bfType!=0x4D42)//判断文件是不是位图文件
{
AfxMessageBox("This is not a bitmap file!!");
bFileRead=FALSE;
bitmapFile.Close();
return;
}

if(m_pBmpInfoHeader->biCompression!=0)//判断图像是不是压缩的
{
AfxMessageBox("This system only support Un-compression!!");
bitmapFile.Close();
return;
}

switch(m_pBmpInfoHeader->biBitCount)//判断颜色的位数
{
case 1:
nPaletteSize=2;
break;
case 4:
nPaletteSize=16;
break;
case 8:
nPaletteSize=256;
break;
case 24:
nPaletteSize=0;//当为真彩色时没有颜色表,所以为0
break;
default:
AfxMessageBox("This color is not valid!!");
bitmapFile.Close();
return;
}

//下面根据不同的图像位数,计算调色板的大小
m_pBmpInfo=(BITMAPINFO *)new char [sizeof(BITMAPINFOHEADER)+nPaletteSize*sizeof(RGBQUAD)];//根据调色板大小给位图分配内存
bitmapFile.Read(&(m_pBmpInfo->bmiColors[0]),nPaletteSize*sizeof(RGBQUAD));//调入调色板数据到位图信息
m_pBmpInfo->bmiHeader=*m_pBmpInfoHeader;//给位图信息的位图信息头赋值

DWORD bytesPerLine=m_pBmpInfoHeader->biWidth*(m_pBmpInfoHeader->biBitCount/8);//计算每行图像所占的字节数
if(bytesPerLine%4!=0)//当宽度为奇数时
bytesPerLine=(bytesPerLine/4+1)*4;//对每行图像进行对齐

/*unsigned int */size=m_pBmpInfoHeader->biHeight*bytesPerLine;//计算图像数据所占大小

pDib=(BYTE*)new char[size];//给图像数据分配内存
bitmapFile.Read(pDib,size);//读入位图数据
bitmapFile.Close();

width=m_pBmpInfoHeader->biWidth;//得到图像数据的宽度
height=m_pBmpInfoHeader->biHeight;//得到图像数据的高度
bFileRead=TRUE;
Invalidate();
}
zhoubz 2008-05-19
  • 打赏
  • 举报
回复
求对BMP处理代码,要求计算图中相同颜色块的面积?大家帮忙,小弟(菜鸟)在此先谢了。
菜牛 2008-05-18
  • 打赏
  • 举报
回复
12楼的,先搞清楚int是几位再说。
实达诚实 2008-05-18
  • 打赏
  • 举报
回复
我也要,顺便发到我有邮箱cqviolet@qq.com
sblt_001 2008-05-13
  • 打赏
  • 举报
回复
我也要,顺便发到我有邮箱sblt_001@qq.com
sblt_001 2008-05-12
  • 打赏
  • 举报
回复
http://www.functionx.com/visualc/bitmaps/DisplayFromFile.htm
hackerxxw 2008-05-08
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include"stdio.h"
#include"dos.h"
#include "stdlib.h"
#include"math.h"

//定义bmp结构
typedef struct
{
int bfType; /* 类型标志,总是BM */
long bfSize; /* 文件大小 */
int bfReserved1;
int bfReserved2;
long bfOffBits; /* 位图点阵偏移量*/
}HEAD;
typedef struct
{
long biSize; /* 结构体字节总数 */
long biWidth; /* 图像宽度 */
long biHeight; /*图像高度 */
int biPlanes; /* 必须为1 */
int biBitCount; /* 每个像素所占二进制位数,可能是1,4,8或 24 */
long biCompress; /*压缩方式*/
long biSizeImage; /*像素点阵大小 */
long biXPelsPerMeter; /* 水平像素数*/
long biYPelsPerMeter; /* 垂直像素数 */
long biClrUsed; /*使用的颜色数 */
long biClrImportant; /*重要颜色数 */
}INFO;
typedef struct
{
unsigned char rgbBlue; /*蓝色所占比重*/
unsigned char rgbGreen; /*绿色所占比重*/
unsigned char rgbRed; /*红色所占比重*/
unsigned char rgbReserved; /*保留字节 */
}RGBQUAD;

//定义一些变量
RGBQUAD straPla[256]; /*256色调色板*/
HEAD strHead;
INFO strInfo;

int main(int argc, char* argv[])
{ //定义文件指针
char filename[30];
FILE *fpi;
printf("输入bmp文件名:");
scanf("%s",&filename);

if((fpi=fopen(filename,"rb"))==NULL)
{
printf("OPEN SOURCE FILE ERROR\n");
exit(0);
}

//读取BMP文件的文件头,信息头
fread((char*)&strHead,1,sizeof(strHead),fpi);
fread((char*)&strInfo,1,sizeof(strInfo),fpi);

//读取BMP的256色颜色表
for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fread((char*)&straPla[nCounti],1,sizeof(RGBQUAD),fpi);
}

//此时fpi指针应该指向了图像数据!

//测试数据
int count=strHead.bfType; //文件头标志
printf("bitBitCount value is %x\n",count);
}


输出为:bitBitCount value is 364d42
而理论上应该是:4d42
ollydbg23 2008-04-24
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/viewcode.asp?id=1927
还有这篇也非常的好!
ollydbg23 2008-04-24
  • 打赏
  • 举报
回复
呵呵,要代码的人太多了,个人觉得,这一些代码实在是 太多了,大家可以网上找找啊。
http://www.vckbase.com/code/viewcode.asp?id=1934
综述级别的文章。

vckbase上面分类很齐全,找一下非常快
paerxiushi 2008-04-21
  • 打赏
  • 举报
回复
楼主windows编程操作位图看懂了没?看懂了话,把邮箱地址发给我,我发份源代码给你
gz442060097 2008-04-21
  • 打赏
  • 举报
回复
我也要,可以发一份给我吗? mgracy@163.com
疯魔症 2008-04-21
  • 打赏
  • 举报
回复
发我一份可以么我的邮箱luoyangzwb@163.com
[Quote=引用 7 楼 paerxiushi 的回复:]
楼主windows编程操作位图看懂了没?看懂了话,把邮箱地址发给我,我发份源代码给你
[/Quote]
疯魔症 2008-04-16
  • 打赏
  • 举报
回复
我刚做完这个,发个代码

int MyDib::LoadBmpTwo(const char * lpszFileName)
{
CFile cf;
BITMAPFILEHEADER BFH;
DWORD dwDibSize;

if(!cf.Open(lpszFileName,CFile::modeRead))
return 1; //没打开文件
dwDibSize = cf.GetLength() - sizeof(BITMAPFILEHEADER);

if(m_pDib!=NULL) delete [] m_pDib;
m_pDib = new BYTE [dwDibSize]; //建立原始DIB

if(m_pDib == NULL)
return 2; //建立DIB出错
if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) ||
BFH.bfType != 'MB' || cf.Read(m_pDib,dwDibSize)!=dwDibSize)
{delete [] m_pDib; return 3;} //读DIB出错

cf.Close();

if(m_pDibParim!=NULL) delete [] m_pDibParim;
m_pDibParim = new BYTE [dwDibSize];
if(m_pDibParim == NULL) return 4;//复制出错
memcpy(m_pDibParim,m_pDib,dwDibSize);

bFileRead = true;
return 0; //成功
}
rover___ 2008-04-16
  • 打赏
  • 举报
回复
BMP文件格式是相当简单的,针对格式相同的大量位图文件,你可以直接从文件读取象素的RGB值。
paerxiushi 2008-04-14
  • 打赏
  • 举报
回复
楼主还没搞定这个问题呀,算了,说也说不清楚,你去下个《Windows程序设计(第五版)》来
http://book2.shubulo.com/book/pro/Windows程序设计(第五版)北大版.rar
翻到第十四章,仔细看看吧。
用户 昵称 2008-04-14
  • 打赏
  • 举报
回复
对2楼的补充,load之后显示出来

		CPaintDC dc(this); 
CBitmap bm;
//bm.LoadBitmap( IDB_BITMAP1 ); 用2楼的方法。
CDC *pdc = new CDC;
pdc->CreateCompatibleDC( &dc );
CBitmap *p = pdc->SelectObject( &bm );

dc.BitBlt( 0, 0, 100, 100, pdc, 0, 0, SRCCOPY );
pdc->SelectObject( p );
pdc->DeleteDC();
delete pdc;
CDialog::OnPaint();
cofanz 2008-04-14
  • 打赏
  • 举报
回复
如果仅仅是BMP的话,用LoadImage就可以
LoadImage(NULL, "d:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
icosagon 2008-04-14
  • 打赏
  • 举报
回复
不能用现在的API?

19,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧