c语言完成,直接写代码,不用解释,写出完整代码:编写程序完成BMP图像(真彩色、256色)反色处理等功能。...
时间: 2024-03-17 21:41:47 浏览: 86
以下是C语言代码,可以完成BMP图像的反色处理功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1) // 设定结构体按1字节对齐
typedef struct tagBITMAPFILEHEADER {
unsigned short bfType; // 文件类型,必须为0x424D
unsigned int bfSize; // 文件大小
unsigned short bfReserved1;// 保留,为0
unsigned short bfReserved2;// 保留,为0
unsigned int bfOffBits; // 文件头和位图数据之间的偏移量
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
unsigned int biSize; // 信息头大小
int biWidth; // 图像宽度
int biHeight; // 图像高度
unsigned short biPlanes; // 位平面数,必须为1
unsigned short biBitCount; // 每像素位数
unsigned int biCompression;// 压缩类型,0为不压缩
unsigned int biSizeImage; // 压缩图像大小,当biCompression为0时可以为0
int biXPelsPerMeter; // 水平分辨率
int biYPelsPerMeter; // 垂直分辨率
unsigned int biClrUsed; // 颜色数,当biBitCount小于24时有用
unsigned int biClrImportant; // 重要颜色数,当biBitCount小于24时有用
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD {
unsigned char rgbBlue; // 蓝色分量
unsigned char rgbGreen; // 绿色分量
unsigned char rgbRed; // 红色分量
unsigned char rgbReserved; // 保留值
} RGBQUAD;
#pragma pack() // 恢复默认对齐方式
void bmpInvertColor(char* srcFile, char* dstFile) {
FILE* fpSrc, *fpDst;
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
RGBQUAD* colorTable = NULL;
unsigned char* imgData = NULL;
int i, j;
// 打开源文件
fpSrc = fopen(srcFile, "rb");
if (fpSrc == NULL) {
printf("Can't open file %s\n", srcFile);
return;
}
// 读取文件头
fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fpSrc);
if (fileHeader.bfType != 0x4d42) {
printf("File %s is not a BMP file\n", srcFile);
fclose(fpSrc);
return;
}
// 读取信息头
fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fpSrc);
if (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 8) {
printf("File %s is not a truecolor or indexed BMP file\n", srcFile);
fclose(fpSrc);
return;
}
// 读取调色板
if (infoHeader.biBitCount == 8) {
colorTable = (RGBQUAD*)malloc(infoHeader.biClrUsed * sizeof(RGBQUAD));
fread(colorTable, sizeof(RGBQUAD), infoHeader.biClrUsed, fpSrc);
}
// 分配图像数据缓冲区
imgData = (unsigned char*)malloc(infoHeader.biSizeImage);
if (imgData == NULL) {
printf("Can't allocate memory for image data\n");
if (colorTable != NULL) {
free(colorTable);
}
fclose(fpSrc);
return;
}
// 读取图像数据
fread(imgData, 1, infoHeader.biSizeImage, fpSrc);
// 关闭源文件
fclose(fpSrc);
// 反色处理
if (infoHeader.biBitCount == 24) {
// 真彩色图像
for (i = 0; i < infoHeader.biHeight; i++) {
for (j = 0; j < infoHeader.biWidth; j++) {
imgData[(i * infoHeader.biWidth + j) * 3 + 0] = 255 - imgData[(i * infoHeader.biWidth + j) * 3 + 0];
imgData[(i * infoHeader.biWidth + j) * 3 + 1] = 255 - imgData[(i * infoHeader.biWidth + j) * 3 + 1];
imgData[(i * infoHeader.biWidth + j) * 3 + 2] = 255 - imgData[(i * infoHeader.biWidth + j) * 3 + 2];
}
}
} else {
// 256色图像
for (i = 0; i < infoHeader.biHeight; i++) {
for (j = 0; j < infoHeader.biWidth; j++) {
imgData[i * infoHeader.biWidth + j] = 255 - imgData[i * infoHeader.biWidth + j];
}
}
}
// 打开目标文件
fpDst = fopen(dstFile, "wb");
if (fpDst == NULL) {
printf("Can't create file %s\n", dstFile);
free(imgData);
if (colorTable != NULL) {
free(colorTable);
}
return;
}
// 写入文件头
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fpDst);
// 写入信息头
fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fpDst);
// 写入调色板
if (infoHeader.biBitCount == 8) {
fwrite(colorTable, sizeof(RGBQUAD), infoHeader.biClrUsed, fpDst);
}
// 写入图像数据
fwrite(imgData, 1, infoHeader.biSizeImage, fpDst);
// 关闭目标文件
fclose(fpDst);
// 释放内存
free(imgData);
if (colorTable != NULL) {
free(colorTable);
}
printf("File %s has been processed and saved to %s\n", srcFile, dstFile);
}
```
在代码中,`bmpInvertColor`函数可以对BMP图像进行反色处理,并将结果保存到指定的文件中。该函数需要传入源文件名和目标文件名两个参数,分别表示要反色处理的原始图像文件和保存结果的目标文件。该函数首先读取源文件的文件头、信息头和调色板(如果有),然后分配一个足够大的缓冲区来存储图像数据,接着读取图像数据并进行反色处理,最后将结果写入目标文件中。在反色处理过程中,如果图像是真彩色,则对每个像素的红、绿、蓝三个分量分别进行反色处理;如果图像是256色,则只需对每个像素的索引进行反色处理即可。
要使用该函数进行反色处理,只需在调用`bmpInvertColor`函数时传入源文件名和目标文件名两个参数即可,例如:
```c
bmpInvertColor("test.bmp", "test_inverted.bmp");
```
这将对名为`test.bmp`的BMP图像进行反色处理,并将结果保存到名为`test_inverted.bmp`的文件中。
阅读全文