使用C语言完成:读取一幅24位真彩的bmp图像,给图像四周加 一个宽度大于 1 像素的任意颜色的边框,另存为图像文件 IMG3_24.bmp。
时间: 2024-05-05 13:15:21 浏览: 164
readbmp.rar_C 语言 bmp 图像_C语言读取位图_bmp读图_像素读取
这个任务需要使用BMP图像的文件格式,以及C语言的文件操作和图像处理知识。
首先需要了解BMP图像的文件格式,可以参考以下链接:
https://en.wikipedia.org/wiki/BMP_file_format
然后可以按照以下步骤完成任务:
1. 打开原图像文件,读取BMP文件头和位图信息头,获取图像的宽度、高度、每个像素占用的字节数等信息。
2. 根据获取的图像信息,创建一个新的图像数组,包含原图像加上四周边框的像素。
3. 填充新图像数组的像素值,其中四周边框的像素颜色可以任意选择,比如设为红色。
4. 将新图像数组写入BMP文件,保存为IMG3_24.bmp。
下面是示例代码,可以根据具体情况进行修改和优化:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1) // 设置结构体按1字节对齐
typedef struct {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BMPFileHeader;
typedef struct {
unsigned int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BMPInfoHeader;
int main()
{
// 打开原图像文件
FILE* fp = fopen("IMG_24.bmp", "rb");
if (!fp) {
printf("Error: cannot open file.\n");
return 1;
}
// 读取BMP文件头和位图信息头
BMPFileHeader fileHeader;
BMPInfoHeader infoHeader;
fread(&fileHeader, sizeof(BMPFileHeader), 1, fp);
fread(&infoHeader, sizeof(BMPInfoHeader), 1, fp);
// 获取图像信息
int width = infoHeader.biWidth;
int height = infoHeader.biHeight;
int bpp = infoHeader.biBitCount / 8;
int rowSize = (width * bpp + 3) / 4 * 4; // 每行像素数据的字节数,需要按4字节对齐
int imageSize = rowSize * height; // 总的像素数据大小
// 创建新图像数组,包含四周边框的像素
int borderWidth = 10; // 边框宽度,可以自行调整
int newWidth = width + borderWidth * 2;
int newHeight = height + borderWidth * 2;
int newImageSize = newWidth * newHeight * bpp;
unsigned char* imageData = (unsigned char*)malloc(newImageSize);
memset(imageData, 0, newImageSize);
// 填充新图像数组的像素值,其中四周边框的像素颜色设为红色
for (int y = 0; y < newHeight; y++) {
for (int x = 0; x < newWidth; x++) {
int index = (y * newWidth + x) * bpp;
if (x < borderWidth || x >= newWidth - borderWidth || y < borderWidth || y >= newHeight - borderWidth) {
imageData[index] = 0; // 蓝色通道
imageData[index + 1] = 0; // 绿色通道
imageData[index + 2] = 255; // 红色通道
}
else {
// 读取原图像的像素值,复制到新图像数组中
int oldX = x - borderWidth;
int oldY = y - borderWidth;
int oldIndex = (oldY * width + oldX) * bpp;
fread(&imageData[index], sizeof(unsigned char), bpp, fp);
}
}
}
// 关闭原图像文件
fclose(fp);
// 创建新的BMP文件,写入新图像数组
fp = fopen("IMG3_24.bmp", "wb");
if (!fp) {
printf("Error: cannot create file.\n");
return 1;
}
// 修改BMP文件头和位图信息头的相关信息
fileHeader.bfSize = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + newImageSize;
infoHeader.biWidth = newWidth;
infoHeader.biHeight = newHeight;
infoHeader.biSizeImage = newImageSize;
// 写入BMP文件头和位图信息头
fwrite(&fileHeader, sizeof(BMPFileHeader), 1, fp);
fwrite(&infoHeader, sizeof(BMPInfoHeader), 1, fp);
// 写入像素数据
fwrite(imageData, sizeof(unsigned char), newImageSize, fp);
// 关闭新的BMP文件
fclose(fp);
// 释放内存
free(imageData);
printf("Done.\n");
return 0;
}
```
阅读全文