欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写入数据到bmp位图文件(C语言)

程序员文章站 2022-07-15 21:58:22
...

在上一篇文章  读取bmp格式位图文件到二维数组(C语言)  中已经实现了读取24bits Bmp位图文件到二维数组的过程。

这次接着上一次的工作,试着用C语言将数据写入位图文件中。

基本原理和读取文件是类似的,只不过我们要把上次使用的fread换成fwrite:

1.写入文件头:

fwrite(fileHead, sizeof(BITMAPFILEHEADER), 1, fp);

2.写入信息头:

fwrite(infoHead, sizeof(BITMAPINFOHEADER), 1, fp);

3.循环写入像素信息:

for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            fwrite(&data[i][j], sizeof(RGBDATA), 1, fp);
        }
}

代码如下:

FILE* saveMatrixToBmpFile(BITMAPFILEHEADER* fileHead, BITMAPINFOHEADER* infoHead, RGBDATA** data,FILE* fp) {
	int bitsPerPixel = infoHead->bBitsPerPixel;
	if (bitsPerPixel != 24) {
		fprintf(stderr, "本功能目前只适用于24位位图");
		return NULL;
	}
	int width = infoHead->bImageWidth;
	int height = infoHead->bImageHeight;
	printf("初始:%d\n", ftell(fp));
	fwrite(fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
	printf("写入文件头:%d\n", ftell(fp));
	fwrite(infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
	printf("写入信息头:%d\n", ftell(fp));
	for (int i = 0; i < height; i++) {
		for (int j = 0; j < width; j++) {
			fwrite(&data[i][j], sizeof(RGBDATA), 1, fp);
		}
	}
	printf("写入像素:%d\n", ftell(fp));
	return fp;
}

再实现一个函数用来实现图像翻转:(交换二维数组的行指针)

代码如下:

RGBDATA** flipMatrix(RGBDATA** data, int n) {
	int i = 0;
	int j = n-1;
	while (i < j) {
		RGBDATA* temp = data[j];
		data[j] = data[i];
		data[i] = temp;
		i++;
		j--;
	}
	return data;
}

有了这两个函数,我们就可以试着读取一个bmp图片,将其绕x轴翻转再存入文件了:

int main() {
	FILE* fp = openBmpImage("lena.bmp","r");
	BITMAPFILEHEADER* fileHead = readBmpFileHead(fp);
	BITMAPINFOHEADER* infoHead = readBmpInfoHead(fp);
	RGBDATA ** data = readBmpDataToArr(fp);
	closeBmpImage(fp);
	data = flipMatrix(data,512);
	FILE* fp_new = openBmpImage("new.bmp", "w");
	saveMatrixToBmpFile(fileHead, infoHead, data, fp_new);
	closeBmpImage(fp_new);
	getchar();
	return 0;
}

效果如下:

处理前

写入数据到bmp位图文件(C语言)

处理后:

写入数据到bmp位图文件(C语言)

这样就完成了bmp文件的读写,实现仓促代码中还有很多细节问题,比如只支持24位bits的图像等等,以后有机会慢慢改吧。

 

 

相关标签: 图像处理