程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;
#pragma pack()
void Bmp_Bigger_And_Smaller(char *path)
{
FILE *fpr1 = fopen(path, "rb");
FILE *fpw2 = fopen("new.bmp", "wb");
if (fpr1 == NULL || fpw2 == NULL)
{
printf("图片打开失败!\n");
return;
}
struct tagBITMAPFILEHEADER head;
struct tagBITMAPINFOHEADER info;
fread(&head, sizeof(BITMAPFILEHEADER), 1, fpr1);
fread(&info, sizeof(BITMAPINFOHEADER), 1, fpr1);
unsigned int old_width = info.biWidth;
unsigned int old_height = info.biHeight;
int old_ret = (4 - old_width * 3 % 4) % 4;
unsigned char *src_data = malloc(old_width * old_height * 3 + old_ret * old_height);
fseek(fpr1, 54, SEEK_SET);
fread(src_data, old_width * old_height * 3 + old_ret * old_height, 1, fpr1);
printf("原图片的宽:%d\n", old_width);
printf("原图片的高:%d\n", old_height);
unsigned int new_Width, new_Height;
printf("请输入新图片的宽:\n");
scanf("%d", &new_Width);
printf("请输入新图片的高:\n");
scanf("%d", &new_Height);
int ret = (4 - new_Width * 3 % 4) % 4;
head.bfSize = new_Width * new_Height * 3 + 54 + ret * new_Height;
info.biSizeImage = new_Width * new_Height * 3 + ret * new_Height;
info.biWidth = new_Width;
info.biHeight = new_Height;
fwrite(&head, sizeof(BITMAPFILEHEADER), 1, fpw2);
fwrite(&info, sizeof(BITMAPINFOHEADER), 1, fpw2);
int i = 0, j = 0;
unsigned long dwsrcX, dwsrcY;
unsigned char *pucDest;
unsigned char *pucSrc;
unsigned char *dest_data = calloc(1, new_Width * new_Height * 3 + ret * new_Height);
for (i = 0; i < new_Height; i++)
{
dwsrcY = i * old_height / new_Height;
pucDest = dest_data + i * new_Width * 3 + ret * i;
pucSrc = src_data + dwsrcY * old_width * 3 + old_ret * dwsrcY;
for (j = 0; j < new_Width + ret; j++)
{
dwsrcX = j * old_width / new_Width;
memcpy(pucDest + j * 3, pucSrc + dwsrcX * 3, 3);
}
}
fseek(fpw2, 54, SEEK_SET);
fwrite(dest_data, new_Width * new_Height * 3 + ret * new_Height, 1, fpw2);
printf("生成新图片成功!\n");
free(dest_data);
free(src_data);
fclose(fpr1);
fclose(fpw2);
}
int main(int argc, char const *argv[])
{
Bmp_Bigger_And_Smaller(argv[1]);
return 0;
}
测试结果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异