纯C下的读写BMP文件代码

本文介绍了一个使用纯C语言编写的简单程序,该程序能够读取和写入BMP格式的图像文件。通过定义像素数据结构并利用文件操作函数,实现了BMP文件的读写功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

纯C代码下读写BMP文件代码,简单易懂。

/**//*************************************************************
**Copyright(c)2007,Shanghai
**
**文件名称:read_write_bmp_with_C.c
**编译:VisualC++/ANSIC/ISOC++
**日期:2007.10.24
*************************************************************
*/


#include"stdio.h"
#include
"stdlib.h"

#definePIXPLINE320

typedef
structtagRGBQUAD...{//定义每个像素的数据类型
unsignedcharrgbBlue;
unsigned
charrgbGreen;
unsigned
charrgbRed;
}
RGBQUAD;

intbmp_read(unsignedchar*image,intxsize,intysize,char*filename)...{
charfname_bmp[128];
sprintf(fname_bmp,
"%s.bmp",filename);

FILE
*fp;
if(!(fp=fopen(fname_bmp,"rb")))
return-1;

unsigned
charheader[54];
fread(header,
sizeof(unsignedchar),54,fp);
fread(image,
sizeof(unsignedchar),(size_t)(long)xsize*ysize*3,fp);

fclose(fp);
return0;
}


intbmp_write(unsignedchar*image,intxsize,intysize,char*filename)...{
unsigned
charheader[54]=...{
0x42,0x4d,0,0,0,0,0,0,0,0,
54,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,1,0,24,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0
}
;

longfile_size=(long)xsize*(long)ysize*3+54;
header[
2]=(unsignedchar)(file_size&0x000000ff);
header[
3]=(file_size>>8)&0x000000ff;
header[
4]=(file_size>>16)&0x000000ff;
header[
5]=(file_size>>24)&0x000000ff;

longwidth=xsize;
header[
18]=width&0x000000ff;
header[
19]=(width>>8)&0x000000ff;
header[
20]=(width>>16)&0x000000ff;
header[
21]=(width>>24)&0x000000ff;

longheight=ysize;
header[
22]=height&0x000000ff;
header[
23]=(height>>8)&0x000000ff;
header[
24]=(height>>16)&0x000000ff;
header[
25]=(height>>24)&0x000000ff;

charfname_bmp[128];
sprintf(fname_bmp,
"%s.bmp",filename);

FILE
*fp;
if(!(fp=fopen(fname_bmp,"wb")))
return-1;

fwrite(header,
sizeof(unsignedchar),54,fp);
fwrite(image,
sizeof(unsignedchar),(size_t)(long)xsize*ysize*3,fp);

fclose(fp);
return0;
}


voidclonebmp(unsignedchar*image,intxsize,intysize)
...{
bmp_read(image,xsize,ysize,
"orgbmp");//orgbmp为当前目录下的bmp文件名
bmp_write(image,xsize,ysize,"clone_bmp");//clone_bmp为克隆的bmp文件名
}



/**//****************************************************************************
*名称:youwritetobmp()
*功能:写入bmp文件
*入口参数:RGBQUAD*pixarr----要写入的像素数组指针,intxsize----图像宽度,intysize----图像高度,char*filename--图像名称
*出口参数:无
*返回值:-1:错误;0:正确
***************************************************************************
*/

intyouwritetobmp(RGBQUAD*pixarr,intxsize,intysize,char*filename)...{
unsigned
charheader[54]=...{
0x42,0x4d,0,0,0,0,0,0,0,0,
54,0,0,0,40,0,0,0,0,0,
0,0,0,0,0,0,1,0,24,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0
}
;
inti;
intj;
longfile_size=(long)xsize*(long)ysize*3+54;
header[
2]=(unsignedchar)(file_size&0x000000ff);
header[
3]=(file_size>>8)&0x000000ff;
header[
4]=(file_size>>16)&0x000000ff;
header[
5]=(file_size>>24)&0x000000ff;

longwidth;
if(!(xsize%4))width=xsize;
elsewidth=xsize+(4-xsize%4);//如不是4的倍数,则转换成4的倍数
header[18]=width&0x000000ff;
header[
19]=(width>>8)&0x000000ff;
header[
20]=(width>>16)&0x000000ff;
header[
21]=(width>>24)&0x000000ff;

longheight=ysize;
header[
22]=height&0x000000ff;
header[
23]=(height>>8)&0x000000ff;
header[
24]=(height>>16)&0x000000ff;
header[
25]=(height>>24)&0x000000ff;

charfname_bmp[128];
sprintf(fname_bmp,
"%s.bmp",filename);

FILE
*fp;
if(!(fp=fopen(fname_bmp,"wb")))
return-1;

fwrite(header,
sizeof(unsignedchar),54,fp);

RGBQUADzero
=...{0,0,0};//不足字节,用zero填充

for(j=0;j<ysize;j++)...{
if(!(xsize%4))...{
for(i=0;i<xsize;i++)...{
fwrite(pixarr
+i,sizeof(RGBQUAD),1,fp);
}

}

else
...{
for(i=0;i<xsize;i++)...{
fwrite(pixarr
+i,sizeof(RGBQUAD),1,fp);
}

for(i=xsize;i<xsize+(4-xsize%4);i++)...{
fwrite(
&zero,sizeof(RGBQUAD),1,fp);
}

}

}


fclose(fp);
return0;

}


intmain()...{
unsigned
char*image;
intxsize=320;
intysize=163;

RGBQUADpixarray[PIXPLINE];
//一行像素值数组

image
=(unsignedchar*)malloc((size_t)xsize*ysize*3);
if(image==NULL)
return-1;
clonebmp(image,xsize,ysize);
//功能一:实现一副图像的拷贝


youwritetobmp(pixarray,xsize,ysize,
"yourimage");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值