BMP图片显示程序

原创 2006年05月20日 02:28:00

/*2002-11-28
 *
 */
/*位图文件头*/
typedef struct
{
 int imgType;/*位图的标志,即ASCII码为BM。两字节*/
 long imgHeadSize;/*位图的文件的总字节数 4字节*/
 long imgReserved;/*保留字4字节00 00 00 00*/
 long imgBeginBit;/*位图阵列的起始位置,一般是54字节开始为位图阵列*/
}IMGHEAD;
 
/*位图信息头

bfSize:位图文件的大小。等于位图文件头+信息头+颜色表+位数据。以字节为单位即:sizeof(bmfh)+sizeof(bmih)+sizeof(RGBQUAD)*256+bmih.biSizeImage

*/
typedef struct
{
 long imgHeadInfSize;/*位图信息头的长度,一般位图信息头占用40个字节。*/
 long imgWidth;/*位图宽*/
 long imgHeight;
 int imgPlance;/*位图设备级别 01 00*/
 int imgBitcount;/*位图级别00 18H=24即24位真彩色。*/
 long imgCompression;/*压缩类型 为0代理不压缩。*/
 long imgSizeimage;/*位图大小*/
 long imgXpels;/*水平分辨率。*/
 long imgYpels;/*垂真分辨率*/
 long imgClrused;/*位图实际使用的颜色表中的颜色变址数*/
 long imgClrimportant;/*位图显示过程中被认为重要颜色变址数*/
}IMGINFHEAD;
 

typedef struct RGBCOLOR
{
 unsigned  char R;
 unsigned char G;
 unsigned char B;
 unsigned char Z;
}RGBColor;

typedef struct
{
 IMGHEAD IMGBmpHead;
 IMGINFHEAD IMGBMPINFHEAD;
 RGBColor *pallette;
 unsigned char *BmpBuffer;
}IMGBmp;

 

int  GetBmp(char *,IMGBmp *);
void ShowBmp(IMGBmp * ,int ,int ,int ,int ,int ,int );
void SetAllPal();

/* 提取图片里的某一块
 *      >参数说明<
 * pic_x,pi_y
 *  所要提取图块所在的位置,
 *   pic_x表示往右第几块,pic_y表示往下第几块
 * width,height
 *  所要提取图块的宽高
 *
*/
void ShowBmp(IMGBmp * structBMP,int x,int y,int pic_x,int pic_y,int width,int height)
{
 unsigned char *p;
 int i,ii,old_x;/*每行多出的00字符*/
 p=structBMP->BmpBuffer+(structBMP->IMGBMPINFHEAD).imgHeight*(structBMP->IMGBMPINFHEAD).imgWidth;/*让p指向图像数据区尾部*/
 p-=(structBMP->IMGBMPINFHEAD).imgWidth;/*指针退一行*/
 if(pic_y>0)
 {
  p=p-pic_y*(structBMP->IMGBMPINFHEAD).imgWidth*height; //移到y点
 }
 old_x=x;
/* 设置调色板 */

 for(i=1;i<(1<<(structBMP->IMGBMPINFHEAD).imgBitcount);i++)
 {
  setpal(i,(structBMP->pallette+i)->B>>2,(structBMP->pallette+i)->G>>2,(structBMP->pallette+i)->R>>2);
 }

 for(i=0;i<height;i++)
 {
  for(ii=pic_x*width;ii<pic_x*width+width;ii++,x++)
  {
   if(*(p+ii)!=0)
    PutPixel(x,y,*(p+ii));
  }
  y++;
  x=old_x;
  p-=(structBMP->IMGBMPINFHEAD).imgWidth;/*指针退一行*/
 }
}

/*
 *
 * 传递文件名和指向图像数据区的指针
 * structBMP 传递过来的是结构的地址
 */
int  GetBmp(char *fileName,IMGBmp * structBMP)
{
 int i;
 long imgWidthPixel;/*图像每行的字节数*/
 FILE *img_fp;
 if((img_fp=fopen(fileName,"rb"))==NULL)/*test256*/
 {
  printf("/nCan't open The file for %s ! /n",fileName);
  printf("Press any key to halt!");
  return(FALSE);
 }
 
 fread(&(structBMP->IMGBmpHead),sizeof(structBMP->IMGBmpHead),1, img_fp); /*读位图文件头*/
 fread(&(structBMP->IMGBMPINFHEAD),sizeof(structBMP->IMGBMPINFHEAD),1, img_fp); /*读位图信息头*/


 if((structBMP->IMGBMPINFHEAD).imgBitcount!=8)
 {
  printf("/nSorry this soft only support 256 color! /n");
  printf("Press any key to halt!");
  fclose(img_fp);
  return(FALSE);
 }
 if((structBMP->IMGBMPINFHEAD).imgCompression)
 {
  printf("/nSorry this soft only support noCompression BMP! /n");
  printf("Press any key to halt!");
  fclose(img_fp);
  return(FALSE);
 }

 /*读取调色板信息 分配 3*256 2的8次等于256*/
 if((structBMP->pallette=(RGBColor *)malloc(sizeof(RGBColor)*(1<<(structBMP->IMGBMPINFHEAD).imgBitcount)))==NULL)/*分配调色板信息的大小*/
 {
  printf("/nmalloc pat failt! /n");
  printf("Press any key to halt!");
  fclose(img_fp);
  free(structBMP->pallette);
  return FALSE;
 }


 fread(structBMP->pallette,sizeof(RGBColor),1<<(structBMP->IMGBMPINFHEAD).imgBitcount,img_fp);/*读256次,每次3个字节,这样就读出了所用的颜色表了*/
/* 设置调色板 */
/*
 for(i=1;i<(1<<(structBMP->IMGBMPINFHEAD).imgBitcount);i++)
 {
  setpal(i,(structBMP->pallette+i)->B>>2,(structBMP->pallette+i)->G>>2,(structBMP->pallette+i)->R>>2);
 }
*/
 fseek(img_fp,(structBMP->IMGBmpHead).imgBeginBit,SEEK_SET);/*移到数据区*/
 i=0;
 imgWidthPixel=(structBMP->IMGBMPINFHEAD).imgSizeimage/(structBMP->IMGBMPINFHEAD).imgHeight;/*得到图像每行的字节数*/
/*structBMP->BmpBuffer指向新分配的内存*/
 if((structBMP->BmpBuffer=(char *)malloc((structBMP->IMGBMPINFHEAD).imgHeight*(structBMP->IMGBMPINFHEAD).imgWidth))==NULL)/*分配图像的大小*/
 {
  printf("/nmalloc images failt! %ld /n",((structBMP->IMGBMPINFHEAD).imgHeight*(structBMP->IMGBMPINFHEAD).imgWidth));
  printf("Press any key to halt!");
  fclose(img_fp);
  free(structBMP->BmpBuffer);
  return FALSE;
 }
 while(!feof(img_fp))
 {
  fread(structBMP->BmpBuffer+i,(structBMP->IMGBMPINFHEAD).imgWidth,1, img_fp); /*读取每一行,把数据塞到新分配的内存*/
  if(!feof(img_fp))
  {
   fseek(img_fp,imgWidthPixel-(structBMP->IMGBMPINFHEAD).imgWidth,SEEK_CUR);/*跳过每行结束的00字符*/
   i+=(structBMP->IMGBMPINFHEAD).imgWidth;/*i 指向了下一行*/
  }
 }
/* fseek(fil_ptr,bmfh.bfOffBits,SEEK_SET);*/
 fclose(img_fp);

/* p=structBMP->BmpBuffer+(structBMP->IMGBMPINFHEAD).imgHeight*(structBMP->IMGBMPINFHEAD).imgWidth;/*让p指向图像数据区尾部*/
/* p-=(structBMP->IMGBMPINFHEAD).imgWidth;/*指针退一行*/
/* for(i=0;i<(structBMP->IMGBMPINFHEAD).imgHeight;i++)
 {
  for(ii=0;ii<(structBMP->IMGBMPINFHEAD).imgWidth;ii++)
  {
   PutPixel(ii,i,*(p+ii));
  }
  p-=(structBMP->IMGBMPINFHEAD).imgWidth;/*指针退一行*/
/* }
 getch();*/
 return(TRUE);
}


/* 设置系统所有调色板 */
void SetAllPal()
{
 FILE *act;
 int  i,r,g,b;
 act=fopen("comm.act","rb");
 for (i=0;i<256;i++)
 {
  r=fgetc(act)>>2;
  g=fgetc(act)>>2;
  b=fgetc(act)>>2;
  if(i==0)continue;/*去除背景色*/
  setpal(i,r,g,b);
 }
 fclose(act);
}

窗口中显示bmp图片的过程

创建步骤 我们首先大致了解下显示位图的基本步骤,主要有5步,如图1所示:                                                            ...
  • xiao3404
  • xiao3404
  • 2016年12月21日 22:34
  • 635

MFC 显示bmp图片

首先从工具箱中选择一个Picture Control 和3个Button到对话框 取Picture Control 的 ID 为IDC_STATIC_PICURE 然后添加bmp资源文件 ...
  • fulianzhou
  • fulianzhou
  • 2015年10月17日 11:39
  • 1603

VC++中bmp图象的显示

前段时间想用VC的对话框来动态地显示一副BMP位图,查了很多篇文章发现都写的很复杂(而且貌似许多都是复制粘贴而来),真正有价值的不多.其实VC显示BMP文件是很方便的,所有的代码加在一起也不过五六行而...
  • u012252959
  • u012252959
  • 2017年03月22日 19:23
  • 682

VC打开并缩放显示位图(.BMP)文件的方法

VC打开并缩放显示位图(.BMP)文件的方法 最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSD...
  • lxw907304340
  • lxw907304340
  • 2015年05月05日 14:19
  • 1335

读取BMP文件并显示出来(C++实现)

读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构 bmp的文件格式 bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。...
  • wobuzhidao8
  • wobuzhidao8
  • 2017年03月28日 16:15
  • 3764

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

.        一.静态显示bmp图片              1.创建MFC基于对话框程序,添加一个button1和picture控件,其中“资源视图”中编辑picture控件ID为:ID...
  • yu__jia
  • yu__jia
  • 2015年04月22日 16:28
  • 2038

MFC对话框中显示BMP,JPG图片

1、MFC对话框显示BMP图片 我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图...
  • zqspp
  • zqspp
  • 2015年01月03日 16:39
  • 998

SetPixel去显示BMP图

最近学习一下图形的知识,一直对位图不太了解,自己开发当中一般都是直接用CIMage 或者别的图形类来进行图形处理,一些本质东西不知道,总感觉比较虚。因为在一些特殊的环境是需要这些知识。 知识引用: ...
  • XiaoZuoay
  • XiaoZuoay
  • 2015年04月27日 17:35
  • 666

使用CStatic显示图片(bmp、ico、png)

一、显示bmp及ico //h文件 CStatic m_static; //cpp文件 CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP); //加载位图...
  • lgh1992314
  • lgh1992314
  • 2016年09月25日 20:00
  • 1190

MFC实现静态和动态显示bmp图片

代码下载路径:http://download.csdn.net/detail/dafenqie/9690529 1、通过LoadImage函数静态显示一个bmp文件: 1)增加一个pictur...
  • dafenqie
  • dafenqie
  • 2016年11月23日 09:54
  • 1280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BMP图片显示程序
举报原因:
原因补充:

(最多只允许输入30个字)