c语言完成,直接写代码,不用解释,写出完整代码:编写程序完成BMP图像(真彩色、256色)反色处理等功能。...
时间: 2024-01-01 22:04:04 浏览: 86
真彩色反色处理代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(2) // 结构体成员按2字节对齐
typedef unsigned char BYTE; // 1字节无符号整数
typedef unsigned short WORD; // 2字节无符号整数
typedef unsigned int DWORD; // 4字节无符号整数
// BMP文件头
typedef struct {
WORD bfType; // 文件类型,必须是0x4D42
DWORD bfSize; // 文件大小,单位字节
WORD bfReserved1; // 保留字,必须为0
WORD bfReserved2; // 保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,单位字节
} BITMAPFILEHEADER;
// BMP信息头
typedef struct {
DWORD biSize; // 信息头大小,单位字节
int biWidth; // 图像宽度,单位像素
int biHeight; // 图像高度,单位像素
WORD biPlanes; // 颜色平面数,必须为1
WORD biBitCount; // 每像素位数,常用值为1、4、8、16、24、32
DWORD biCompression; // 压缩类型,0表示不压缩
DWORD biSizeImage; // 图像数据大小,单位字节,当biCompression为0时可设置为0
int biXPelsPerMeter; // 水平分辨率,单位像素/米
int biYPelsPerMeter; // 垂直分辨率,单位像素/米
DWORD biClrUsed; // 颜色表中实际使用的颜色数,如果为0,则使用所有调色板项
DWORD biClrImportant; // 对图像显示有重要影响的颜色数,如果为0,则所有颜色都重要
} BITMAPINFOHEADER;
// 颜色表项
typedef struct {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
// BMP图像数据
typedef struct {
BYTE b;
BYTE g;
BYTE r;
} RGBDATA;
int main()
{
BITMAPFILEHEADER fileHeader; // BMP文件头
BITMAPINFOHEADER infoHeader; // BMP信息头
RGBQUAD *pColorTable; // 颜色表指针
RGBDATA *pData; // 图像数据指针
int width, height; // 图像宽度和高度
int rowSize; // 每行像素占用的字节数
int i, j;
FILE *fp = fopen("image.bmp", "rb"); // 打开BMP文件
if (fp == NULL) {
printf("Open image.bmp failed!\n");
return -1;
}
fread(&fileHeader, sizeof(fileHeader), 1, fp); // 读取BMP文件头
fread(&infoHeader, sizeof(infoHeader), 1, fp); // 读取BMP信息头
if (fileHeader.bfType != 0x4D42) { // 判断文件类型是否为BMP
printf("Invalid file type!\n");
fclose(fp);
return -1;
}
if (infoHeader.biBitCount != 24) { // 判断是否为真彩色
printf("Not a true color image!\n");
fclose(fp);
return -1;
}
width = infoHeader.biWidth;
height = infoHeader.biHeight;
rowSize = (width * 3 + 3) / 4 * 4; // 每行像素占用的字节数必须是4的倍数
// 读取颜色表(真彩色图像无颜色表)
if (infoHeader.biClrUsed > 0) {
pColorTable = (RGBQUAD *)malloc(sizeof(RGBQUAD) * infoHeader.biClrUsed);
fread(pColorTable, sizeof(RGBQUAD), infoHeader.biClrUsed, fp);
free(pColorTable);
}
// 读取图像数据
pData = (RGBDATA *)malloc(rowSize * height);
fread(pData, rowSize, height, fp);
// 反色处理
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
pData[i * width + j].r = 255 - pData[i * width + j].r;
pData[i * width + j].g = 255 - pData[i * width + j].g;
pData[i * width + j].b = 255 - pData[i * width + j].b;
}
}
fclose(fp);
// 写入新的图像数据
fp = fopen("image_reverse.bmp", "wb");
if (fp == NULL) {
printf("Create image_reverse.bmp failed!\n");
free(pData);
return -1;
}
fwrite(&fileHeader, sizeof(fileHeader), 1, fp); // 写入BMP文件头
fwrite(&infoHeader, sizeof(infoHeader), 1, fp); // 写入BMP信息头
fwrite(pData, rowSize, height, fp); // 写入图像数据
fclose(fp);
free(pData);
return 0;
}
```
256色反色处理代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(2) // 结构体成员按2字节对齐
typedef unsigned char BYTE; // 1字节无符号整数
typedef unsigned short WORD; // 2字节无符号整数
typedef unsigned int DWORD; // 4字节无符号整数
// BMP文件头
typedef struct {
WORD bfType; // 文件类型,必须是0x4D42
DWORD bfSize; // 文件大小,单位字节
WORD bfReserved1; // 保留字,必须为0
WORD bfReserved2; // 保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,单位字节
} BITMAPFILEHEADER;
// BMP信息头
typedef struct {
DWORD biSize; // 信息头大小,单位字节
int biWidth; // 图像宽度,单位像素
int biHeight; // 图像高度,单位像素
WORD biPlanes; // 颜色平面数,必须为1
WORD biBitCount; // 每像素位数,常用值为1、4、8、16、24、32
DWORD biCompression; // 压缩类型,0表示不压缩
DWORD biSizeImage; // 图像数据大小,单位字节,当biCompression为0时可设置为0
int biXPelsPerMeter; // 水平分辨率,单位像素/米
int biYPelsPerMeter; // 垂直分辨率,单位像素/米
DWORD biClrUsed; // 颜色表中实际使用的颜色数,如果为0,则使用所有调色板项
DWORD biClrImportant; // 对图像显示有重要影响的颜色数,如果为0,则所有颜色都重要
} BITMAPINFOHEADER;
// 颜色表项
typedef struct {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
// BMP图像数据
typedef struct {
BYTE index;
} INDEXDATA;
int main()
{
BITMAPFILEHEADER fileHeader; // BMP文件头
BITMAPINFOHEADER infoHeader; // BMP信息头
RGBQUAD *pColorTable; // 颜色表指针
INDEXDATA *pData; // 图像数据指针
int width, height; // 图像宽度和高度
int rowSize; // 每行像素占用的字节数
int i, j;
FILE *fp = fopen("image.bmp", "rb"); // 打开BMP文件
if (fp == NULL) {
printf("Open image.bmp failed!\n");
return -1;
}
fread(&fileHeader, sizeof(fileHeader), 1, fp); // 读取BMP文件头
fread(&infoHeader, sizeof(infoHeader), 1, fp); // 读取BMP信息头
if (fileHeader.bfType != 0x4D42) { // 判断文件类型是否为BMP
printf("Invalid file type!\n");
fclose(fp);
return -1;
}
if (infoHeader.biBitCount != 8) { // 判断是否为256色
printf("Not a 256-color image!\n");
fclose(fp);
return -1;
}
width = infoHeader.biWidth;
height = infoHeader.biHeight;
rowSize = (width + 3) / 4 * 4; // 每行像素占用的字节数必须是4的倍数
// 读取颜色表
if (infoHeader.biClrUsed > 0) {
pColorTable = (RGBQUAD *)malloc(sizeof(RGBQUAD) * infoHeader.biClrUsed);
fread(pColorTable, sizeof(RGBQUAD), infoHeader.biClrUsed, fp);
free(pColorTable);
}
// 读取图像数据
pData = (INDEXDATA *)malloc(rowSize * height);
fread(pData, rowSize, height, fp);
// 反色处理
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
pData[i * width + j].index = 255 - pData[i * width + j].index;
}
}
fclose(fp);
// 写入新的图像数据
fp = fopen("image_reverse.bmp", "wb");
if (fp == NULL) {
printf("Create image_reverse.bmp failed!\n");
free(pData);
return -1;
}
fwrite(&fileHeader, sizeof(fileHeader), 1, fp); // 写入BMP文件头
fwrite(&infoHeader, sizeof(infoHeader), 1, fp); // 写入BMP信息头
fwrite(pData, rowSize, height, fp); // 写入图像数据
fclose(fp);
free(pData);
return 0;
}
```
阅读全文