读取bmp图片并对其进行反转,保存的c++代码
时间: 2023-06-09 22:02:44 浏览: 57
以下是读取bmp图片并进行反转的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef int LONG;
#pragma pack(push, 1)
// 声明 BMP 文件的头部信息结构体
typedef struct {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BMPFILEHEADER;
// 声明 BMP 图像的信息结构体
typedef struct {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BMPINFOHEADER;
#pragma pack(pop)
// 定义文件头类型和信息头类型
BMPFILEHEADER bmpFileHeader;
BMPINFOHEADER bmpInfoHeader;
void invertImage(BYTE* imageData, int width, int height);
int main() {
// 打开 BMP 图像文件
FILE* fp = fopen("test.bmp", "rb");
if (fp == NULL) {
printf("Failed to open file.\n");
return -1;
}
// 读取 BMP 文件头
fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp);
// 判断 BMP 文件是否正确
if (bmpFileHeader.bfType != 0x4D42) {
printf("Not a BMP file.\n");
fclose(fp);
return -1;
}
// 读取 BMP 信息头
fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp);
// 读取 BMP 图像数据
int imageSize = bmpInfoHeader.biSizeImage;
int width = bmpInfoHeader.biWidth;
int height = bmpInfoHeader.biHeight;
// 像素数据大小如果为 0,计算一下
if (imageSize == 0) {
imageSize = width * height * 3;
}
BYTE* imageData = (BYTE*) malloc(imageSize);
fseek(fp, bmpFileHeader.bfOffBits, SEEK_SET);
fread(imageData, imageSize, 1, fp);
fclose(fp);
// 对 BMP 图像数据进行反转
invertImage(imageData, width, height);
// 写入反转后的 BMP 图像数据
fp = fopen("inverted.bmp", "wb");
if (fp == NULL) {
printf("Failed to create file.\n");
return -1;
}
fwrite(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp);
fwrite(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp);
fwrite(imageData, imageSize, 1, fp);
fclose(fp);
free(imageData);
return 0;
}
void invertImage(BYTE* imageData, int width, int height) {
int lineSize = width * 3;
BYTE* lineBuffer = (BYTE*) malloc(lineSize);
for (int y = 0; y < height / 2; y++) {
int i1 = y * lineSize;
int i2 = (height - y - 1) * lineSize;
memcpy(lineBuffer, imageData + i1, lineSize);
memcpy(imageData + i1, imageData + i2, lineSize);
memcpy(imageData + i2, lineBuffer, lineSize);
}
free(lineBuffer);
}
```
注意:该代码只适用于 **24位** 位图。对于其他格式的位图,需要根据其特点作出相应修改。