用c++代码写一段输入图片并在图片外围补上一圈黑色像素点
时间: 2023-04-11 07:01:18 浏览: 96
以下是用 C 代码实现输入图片并在图片外围补上一圈黑色像素点的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BORDER_SIZE 1 // 外围黑色像素点的大小
int main()
{
char filename[256];
printf("请输入图片文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "rb");
if (fp == NULL) {
printf("无法打开文件 %s\n", filename);
return 1;
}
// 读取图片头信息
unsigned char header[54];
fread(header, sizeof(unsigned char), 54, fp);
// 获取图片宽度和高度
int width = *(int*)&header[18];
int height = *(int*)&header[22];
// 计算每行像素所占的字节数
int row_size = width * 3;
if (row_size % 4 != 0) {
row_size += 4 - (row_size % 4);
}
// 计算新的宽度和高度
int new_width = width + BORDER_SIZE * 2;
int new_height = height + BORDER_SIZE * 2;
// 计算新的每行像素所占的字节数
int new_row_size = new_width * 3;
if (new_row_size % 4 != 0) {
new_row_size += 4 - (new_row_size % 4);
}
// 分配内存存储原始图片数据和新图片数据
unsigned char *data = (unsigned char*)malloc(row_size * height);
unsigned char *new_data = (unsigned char*)calloc(new_row_size * new_height, sizeof(unsigned char));
// 读取原始图片数据
fread(data, sizeof(unsigned char), row_size * height, fp);
// 关闭文件
fclose(fp);
// 复制原始图片数据到新图片数据中心区域
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int src_index = y * row_size + x * 3;
int dst_index = (y + BORDER_SIZE) * new_row_size + (x + BORDER_SIZE) * 3;
new_data[dst_index] = data[src_index];
new_data[dst_index + 1] = data[src_index + 1];
new_data[dst_index + 2] = data[src_index + 2];
}
}
// 在新图片数据中外围补上黑色像素点
for (int y = 0; y < new_height; y++) {
for (int x = 0; x < new_width; x++) {
if (x < BORDER_SIZE || x >= new_width - BORDER_SIZE || y < BORDER_SIZE || y >= new_height - BORDER_SIZE) {
int dst_index = y * new_row_size + x * 3;
new_data[dst_index] = 0;
new_data[dst_index + 1] = 0;
new_data[dst_index + 2] = 0;
}
}
}
// 写入新图片文件
char new_filename[256];
sprintf(new_filename, "border_%s", filename);
fp = fopen(new_filename, "wb");
if (fp == NULL) {
printf("无法创建文件 %s\n", new_filename);
return 1;
}
fwrite(header, sizeof(unsigned char), 54, fp);
fwrite(new_data, sizeof(unsigned char), new_row_size * new_height, fp);
// 关闭文件
fclose(fp);
// 释放内存
free(data);
free(new_data);
printf("已生成新图片文件 %s\n", new_filename);
return 0;
}
```
注意:以上代码仅供参考,实际使用时需要根据具体情况进行修改和优化。