求一个读取bmp图像倒数组,并显示的程序

2003bbs 2005-04-06 07:03:01
要求将bmp的文件头,信息头等四块分别读到不同的数组里。
然后将图像逐像素显示出来。
求大家帮忙,我不是编程的,编程我实在很菜。
...全文
273 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sboom 2005-05-25
  • 打赏
  • 举报
回复
因为这个是BCB写的,不好意思。。。
2003bbs 2005-05-01
  • 打赏
  • 举报
回复
看了"sboom(+-LingCh-+)(爱美人不爱VC)",基本没明白你的头文件都是些什么.


2003bbs 2005-05-01
  • 打赏
  • 举报
回复
xuchunfang@eyou.com,谢谢!
freizl 2005-04-23
  • 打赏
  • 举报
回复
我还不是很清楚,能发到我的邮箱吗?
谢谢!!!
freizl@126.com
PIPI_QQ 2005-04-14
  • 打赏
  • 举报
回复
还不明白的话,给出你的邮箱,我发过去。
sboom 2005-04-09
  • 打赏
  • 举报
回复
#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include "Unit1.h"
#include"File1.h"

#pragma pack(1)
struct BITMAPFILEHEADER_
{
short type;
int bfSize;
short re1,re2;
int Offbits;
};

struct BITMAPINFO_
{
long size;
long width,height;
short planes,bitCount;
long comp,sizeImg;
long xpels,ypels;
long used,important;
};

//-------------将BMP彩色表的数据校正到BCB TColor的数据。
void SwitchColor(long &c)
{
long blue=c& 0x000000ff;
long green=c& 0x0000ff00;
long red=c& 0x00ff0000;
c=(blue<<16) | green | (red>>16);
}

void xxx()
{
FILE *f=fopen("F:\\FX3.bmp","rb");
if(f==NULL) /*判断文件是否打开成功*/
{
ShowMessage("File open error");
return;
}

fseek(f,0,0);//移动到开头

//----------读BMP文件头
BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_();
if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL)
{
ShowMessage("File read error");
return;
}

//-----------读BMP信息头
BITMAPINFO_ *bmpi=new BITMAPINFO_();
if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL)
{
ShowMessage("File read error2");
return;
}

//--------------读彩色表
long *c=new long[bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_)];
fread((char*)c,bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_),1,f);

//------------显示图形
unsigned char *p=new unsigned char[4];
int i=0,j=0,k=0,wc=0;
TColor *tc;
if(bmpi->width%4==0)//-----------因为BMP图像4字节对齐
wc=bmpi->width/4;
else
wc=bmpi->width/4+1;

for( i=0;i<bmpi->height;i++)
{
for(j=0;j<wc;j++)
{
fread(p,4,1,f);
for(k=0;k<4;k++)
{
long x=c[p[k]];
SwitchColor(x);//----------因为BCB的TCOLOR和BMP的彩色表反了。
Form1->Canvas->Pixels[200+j*4+k][300-i]=x; //------200和300是定位到Canvas的中间而已。
}
}
}
fclose(f);
};

BMP文件是从下倒上,从左到右倒向存储的,位图矩阵的第一行时图像的最底一行。
2003bbs 2005-04-08
  • 打赏
  • 举报
回复
感谢楼上弟兄们(除了广告那位),msdn我没有,谁能把代码贴出来,麻烦先!
lywgm 2005-04-08
  • 打赏
  • 举报
回复
MSDN中有完整的例子:DIBLOOK
zy3481 2005-04-08
  • 打赏
  • 举报
回复
MSDN SAMPLE中有一个DIBLOOK的例子,你看下OpenDocument部分代码就明白了。
thisisll 2005-04-07
  • 打赏
  • 举报
回复
我写了一个DLL你可以看看
我也是刚学的
我只针对24位做的
其他的原理一样就是麻烦点

其中pBmpFile是图象数据的指针

BMP_API BOOL ShowBmp(CDC* pDC,BYTE* pBmpFile)
{
if(pBmpFile==NULL)
return false;
BYTE* pBmp=&pBmpFile[54];
int nWidth,nHeight;
BITMAPINFOHEADER *bmpinfo=(BITMAPINFOHEADER*)&pBmpFile[14];
int bitcount=(int)bmpinfo->biBitCount;
if(bitcount!=24)
{
AfxMessageBox("it can only open 24 bit bmp");
return false;
}
nWidth=bmpinfo->biWidth;
nHeight=bmpinfo->biHeight;
BYTE* pBuf,* ptmp;
int widthbit=4-nWidth*3%4+nWidth*3;
for(int i=0;i<nHeight;i++)
{
pBuf=pBmp+widthbit*i;
for(int j=0;j<nWidth*3;j+=3)
{
ptmp=&pBuf[j];
CPoint point;
point.x=j/3;
point.y=nHeight-i;
pDC->SetPixel(point,RGB(ptmp[2],ptmp[1],ptmp[0]));
}
}
return true;
}
freizl 2005-04-06
  • 打赏
  • 举报
回复
顶一个。。。我也想知道!!!

19,468

社区成员

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

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