读取BMP文件出错

a2289610 2012-02-07 04:01:59
int temp;
int YZM_red[][];
int YZM_green[][];
int YZM_blue[][];
int YZM[][];
FILE *fp = fopen(BMP_filename,"rb");
if(fp == NULL)
{
AfxMessageBox("读取失败!");
}
else
{
for(i=0;i<54;i++)
temp = fgetc(fp);
for(y=H-1;y>=0;y++)
{
for(x=0;x<W;x++)
{
YZM_red[x][y] = fgetc(fp);
YZM_green[x][y] = fgetc(fp);
YZM_blue[x][y] = fgetc(fp);
}
}
fclose(fp);

for(x=0;x<W;x++)
{
for(y=0;y<H;y++)
{
if(YZM_red[x][y]*0.3+YZM_green[x][y]*0.6+YZM_blue[x][y]*0.1<200)
YZM[x][y] = 1;
else
YZM[x][y] = 0;
}
}
CString str;
for(y=0;y<H;y++)
{
for(x=0;x<W;x++)
{
str += YZM[x][y];
}
str += "\n";
}
AfxMessageBox(str);
编译通过。但读取BMP文件出错,提示内存不能写。
...全文
160 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
a2289610 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shn521 的回复:]

int YZM_red[][];
int YZM_green[][];
int YZM_blue[][];
int YZM[][];
数组都没定义大小,而且下面的程序根本就不对啊。先了解bmp格式。
[/Quote]楼上的这个看看:
FILE *fp=fopen(BMP_filename,"rb");
if(fp==NULL)
{
AfxMessageBox("文件不存在!");
}
BITMAPFILEHEADER fileheader;
BITMAPINFO info;
fread(&fileheader,sizeof(fileheader),1,fp);
if(fileheader.bfType!=0x4D42)
{
AfxMessageBox("无位图文件请选择位图文件");
fclose(fp);
}
fread(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
long width=info.bmiHeader.biWidth;
long height=info.bmiHeader.biHeight;
UCHAR *buffer=new UCHAR[info.bmiHeader.biSizeImage];
fseek(fp,fileheader.bfOffBits,0);
fread(buffer,info.bmiHeader.biSizeImage,1,fp);
if(info.bmiHeader.biBitCount==24)
{
int pitch=width%4;
//b g r
if(height>0)
{
//height>0 表示图片颠倒
for(int i=0;i<height;i++)
{
int realPitch=i*pitch;
for(int j=0;j<width;j++)
{
YZM_red[x][y] = atoi(buffer[(i*width+j)*3+2+realPitch]);
YZM_green[x][y] = atoi(buffer[(i*width+j)*3+1+realPitch]);
YZM_blue[x][y] = atoi(buffer[(i*width+j)*3+realPitch]);
}
}
}
else
{
for(int i=0;i<0-height;i++)
{
int realPitch=i*pitch;
for(int j=0;j<width;j++)
{
YZM_red[x][y] = atoi(buffer[(i*width+j)*3+2+realPitch]);
YZM_green[x][y] = atoi(buffer[(i*width+j)*3+1+realPitch]);
YZM_blue[x][y] = atoi(buffer[(i*width+j)*3+realPitch]);
}
}
}
//pDC->TextOut(100,200,"24位图");
}
else if(info.bmiHeader.biBitCount==32)
{ // b g r a
if(height>0)
{
//height>0 表示图片颠倒
for(int i=0;i<0-height;i++)
{
for(int j=0;j<width;j++)
{
YZM_blue[x][y] = atoi(buffer[(i*width+j)*4]);
YZM_green[x][y] = atoi(buffer[(i*width+j)*4+1]);
YZM_red[x][y] = atoi(buffer[(i*width+j)*4+2]);
}
}
}
else
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
YZM_blue[x][y] = atoi(buffer[(i*width+j)*4]);
YZM_green[x][y] = atoi(buffer[(i*width+j)*4+1]);
YZM_red[x][y] = atoi(buffer[(i*width+j)*4+2]);
}
}
}
}
delete buffer;
fclose(fp);
shn521 2012-02-07
  • 打赏
  • 举报
回复
int YZM_red[][];
int YZM_green[][];
int YZM_blue[][];
int YZM[][];
数组都没定义大小,而且下面的程序根本就不对啊。先了解bmp格式。
yoveldf 2012-02-07
  • 打赏
  • 举报
回复
bmp图片数据的前面都是图片信息,看下bmp图片的数据格式,看像素数据是从哪位开始
诶呦 2012-02-07
  • 打赏
  • 举报
回复
是不是数组越界了?加断点单步调试,看到哪里出错。

19,469

社区成员

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

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