在上一篇文章读取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文件的读写,实现仓促代码中还有很多细节问题,比如只支持24位bits的图像等等,以后有机会慢慢改吧。
如果觉得《写入数据到bmp位图文件(C语言)》对你有帮助,请点赞、收藏,并留下你的观点哦!