| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1016 人关注过本帖
标题:c语言读bmp图形
只看楼主 加入收藏
xujianpeng
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-11-8
收藏
 问题点数:0 回复次数:10 
c语言读bmp图形

#i nclude "stdio.h"
#i nclude "conio.h"
#i nclude "dos.h"
#i nclude "graphics.h"
#i nclude "fcntl.h"
#i nclude "math.h"
#i nclude "malloc.h"
#i nclude "io.h"
#i nclude "time.h"

#i nclude "mouse.h" /*自定义头文件*/
#i nclude "Svga64k.h" /*自定义头文件*/

#define N 3 /*按钮数*/
#define Key_x 30 /*按钮位置*/
#define Key_y 150
#define Key_dist 100 /*按钮竖向间距*/


int mouse_x=640,mouse_y=480; /*实时鼠标位置*/
char on_botton=0,click=0,message = 0;
/**on_botton 在鼠标移动到按钮上时为真值,参见***();
click 的值纪录上次在哪个按钮上按下左键;
message 的值决定要调用的子函数*/
void *mouse,*key[3][N]; /*屏幕小块贴图内存指针*/


/**************************程序初始化函数*************************/
int huge Return_SVGA64K(void)
{
return(3); /* 返回各种分辨率的对应编号 0~6 宏定义参见 Svga64k.h
4 意为 800*600 65536色*/
}

void init_prog()
{
int Driver = DETECT,gm = 0;
installuserdriver("Svga64K", Return_SVGA64K);
/*对于svga64k必需执行该函数以安装BGI驱动
各种分辨率的对应编号 0~6 宏定义参见 Svga64k.h */
initgraph(&Driver, &gm, ""); /* 执行TC默认的BGI初始化函数 */

InitMouse(); /*初始化鼠标*/
/* ShowMouse(); */
Setmaxxy(640,480); /*设置鼠标移动范围*/
}


/**************************关闭程序函数*******************************/
void end_prog()
{
int i,j;
free(mouse); /*释放鼠标贴图内存*/
for(i=0;i<3;i++)
for(j=0;j<N;j++)
free(key[i][j]); /*释放按钮贴图内存*/
closegraph(); /*关闭图形系统*/
exit(0); /*返回到操作系统*/
}


/********************** bmp图片显示函数 **************************/

void bmp(int x,int y,char *fname)
{
int width, height, i, j,fp;
typedef struct /*16Mrgb像素类型*/
{
unsigned char b; /*蓝色分量*/
unsigned char g;/*绿色分量*/
unsigned char r;/*红色分量*/
} rgb16M;

char fix; /*调整值*/
rgb16M *buffer; /*显示图片时所需内存缓冲区的指针*/

if((fp = open(fname, O_RDONLY | O_BINARY)) == -1) /*打开.bmp文件*/
{
printf("Can't find file %s \n",fname);
exit(1);
}
lseek(fp, 18, SEEK_SET); /*移动文件指针到第18字节处*/
read(fp, &width, 4); /*读取行列数信息*/
read(fp, &height, 4);
fix = width % 4; /*计算调整值*/
lseek(fp, 54, SEEK_SET); /*移动文件指针到第54字节处*/
buffer = (rgb16M *)malloc(width*sizeof(rgb16M)); /*申请内存空间*/
for(j = height - 1; j >= 0; j--)
{
read(fp, buffer, width*sizeof(rgb16M)); /*读取像素点信息*/
lseek(fp, fix, SEEK_CUR); /*调整指针位置*/
for(i = 0; i < width; i++)
{
setrgbpalette(1026, buffer[i].r >> 3, buffer[i].g >> 2, buffer[i].b >> 3);
/*根据像素点信息计算颜色值,设置调色板*/
putpixel(x + i, y + j, 0); /*在指定位置用指定颜色画点*/
}
}
free(buffer); /*释放内存空间*/
close(fp); /*关闭文件*/
}

/************************精确延时函数***************************/
void timer(long second) /*以秒为单位精确延时*/
{
time_t first;
first = time(NULL); /*读取当前时间值*/
while(difftime(time(NULL),first)<second); /*循环等待*/
}


/**************************程序封面函数***********************/
void splash()
{
bmp(0,0,"logobmp.bmp"); /*显示程序封面图片*/
timer(2); /*延时2秒*/
}


/****************屏幕小块贴图绘制函数*************************/
void draw_item()
{
int i,j; /*贴图区域坐标*/
bmp(0,0,"items.bmp");
mouse = malloc(imagesize(0,0,12,21)); /*申请内存空间*/
getimage(0,80,12,101,mouse); /*截取鼠标图形*/
for(i=0;i<3;i++)
for(j=0;j<N;j++)
{
key[i][j] = malloc(imagesize(0,0,99,19)); /*申请内存空间*/
getimage(100*i,20*j,100*i+99,20*j+19,key[i][j]); /*截取按钮图形*/
}
}

/***************************绘制背景及按钮函数***********************/
void draw_bkg()
{
int i;
bmp(0,0,"bkgbmp.bmp"); /*显示背景图片*/
for(i=0;i<N;i++)
putimage(Key_x,i*Key_dist+Key_y,key[0][i],COPY_PUT); /*在背景上显示按钮*/

}


/*********************刷新鼠标及按钮函数************************/
void ***()
{
int x,y,i;
GetMouseXY(&x,&y); /*得到当前鼠标位置坐标*/
if(x!=mouse_x|y!=mouse_y) /*如果鼠标移动*/
{
putimage(mouse_x,mouse_y,mouse,XOR_PUT); /*将原位置鼠标图形擦除*/
if(!on_botton) /*如果在此之前鼠标没在按钮上*/
{
for(i=0;i<N;i++) /*检测当前鼠标是否移动到按钮上*/
if((x>Key_x)&&(x<100+Key_x)&&(y>i*Key_dist+Key_y)&&(y<i*Key_dist+Key_y+20))
/*鼠标移动到按钮上*/
{
putimage(Key_x,i*Key_dist+Key_y,key[1][i],COPY_PUT);
/*显示鼠标悬停状态时的按钮图片*/
on_botton = i+1; /*改变标志变量的值,以表明悬停在哪个按钮上*/
break; /*退出循环*/
}
}
else /*如果在此之前鼠标已经在按钮上*/
if((x<Key_x)||(x>100+Key_x)||(y<(on_botton-1)*Key_dist+Key_y)||(y>(on_botton-1)*Key_dist+Key_y+20))
/*鼠标离开当前按钮*/
{
putimage(Key_x,(on_botton-1)*Key_dist+Key_y,key[0][on_botton-1],COPY_PUT);
/*恢复按钮图片*/
on_botton = 0; /*清除标志变量的值*/
}
putimage(x,y,mouse,XOR_PUT); /*在新的位置重画鼠标*/
mouse_x=x; /*将当前鼠标位置保存,以供下次参考*/
mouse_y=y;
}

if(GetPressInfo(0)) /*如果在按钮上按下鼠标左键*/
{
click=0;
if(on_botton){
putimage(mouse_x,mouse_y,mouse,XOR_PUT); /*将原位置鼠标图形擦除*/
putimage(Key_x,(on_botton-1)*Key_dist+Key_y,key[2][on_botton-1],COPY_PUT);
/*显示鼠标按下状态时的按钮图片*/
putimage(x,y,mouse,XOR_PUT); /*在新的位置重画鼠标*/
mouse_x=x; /*将当前鼠标位置保存,以供下次参考*/
mouse_y=y;
click=on_botton; /*记录按下按键*/
}
}

if(GetReleaseInfo(0))
/*如果松开鼠标左键*/
{ message=0; /*首先清除信号*/
if(on_botton&&(click==on_botton))
/*如果在先前按下左键的那个按钮上释放左键*/
{
click=0;
putimage(mouse_x,mouse_y,mouse,XOR_PUT); /*将原位置鼠标图形擦除*/
putimage(Key_x,(on_botton-1)*Key_dist+Key_y,key[1][on_botton-1],COPY_PUT); /*恢复按钮图片*/
putimage(x,y,mouse,XOR_PUT); /*在新的位置重画鼠标*/
mouse_x=x; /*将当前鼠标位置保存,以供下次参考*/
mouse_y=y;
message = on_botton; /*发送系统消息*/
}
}
}


/***********************根据message调用子函数**************************/
void call()
{
switch(message)
/*这几个调用的子函数是供测试用的,只有最后一个退出函数有些实用价值,哈哈*/
{
case 1: splash();draw_bkg();break;
case 2:printf("2 ");break;
case 3:end_prog();
break;
}
message=0; /*销毁信号*/
}


/*********************************主函数*****************************/
int main()
{
init_prog(); /*初始化*/
draw_item(); /*绘制贴图块*/
splash(); /* 显示程序封面*/
draw_bkg(); /*显示程序背景*/
while(1) /*程序主循环*/
{
***(); /*刷新程序信息*/
if(message) call(); /**根据当前message的值调用功能模块子函数**/
}
return 0; /*程序结束,返回系统*/
}

搜索更多相关主题的帖子: c语言 nclude bmp 图形 
2007-11-08 15:38
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:18
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:18
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:19
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:20
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:20
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:21
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:21
lizhaoboy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-29
收藏
得分:0 

2007-11-08 16:22
gbgame
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2007-10-27
收藏
得分:0 
这是给新手看的?
2007-11-08 20:12
快速回复:c语言读bmp图形
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017992 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved