马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
将一个bmp图像进行缩小,缩小后的图像不失真- /********************************************************************************
- *
- *
- * 设计图片等比例不失真缩小的接口
- * author:jindouliu2024@163.com
- * date:2025.4.19
- *
- *
- * Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved
- * ****************************************************************************/
复制代码 [code]/*********************************************************************************************************** 计划图片等比例不失真缩小的接口* author:jindouliu2024@163.com * date:2025.4.19* ** Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved* ******************************************************************************************************/#include #include #include #include #include#include #include#include#include#include#include #pragma pack(1)typedef struct tagBITMAP_FILE_HEADER{ short bfType;//文件标识 int bfSize;//文件大小 short bfReserved1;//保存字 short bfReserved2;//保存字 int bfOffBits;//文件指示器偏移量相较于文件开头} bpFile_Header, *PbpFile_Header;typedef struct tagBITMAPINFOHEADER{ int bpSize;//图像形貌信息块的大小 int bpWidth;//图像宽度 int bpHeight;//图像高度 short bpPlanes;//图像的plane总数(恒为1) short bpBitCount;//记载颜色的位数取值1(双色),4,6,24,32 int bpCompression;//数据压缩方式(0:不压缩;1:8位压缩;2:4位压缩) int bpSizeImage;//图像区数据的大小,必须是4的倍数 int bpXPelsPerMeter;//水平每米有多少像素,在设备无关位图中,填写00H int bpYPelsPerMeter;//垂直每米有多少像素,在设备无关位图中,填写00H int bpClrUsed;// 此图像全部的颜色数,不用,固定为0 int bpClrImportant;// 重要颜色数,不用,固定为0} bpINFO_HEADER, *PbpINFO_HEADER;#pragma pack()bool Shrink_Picture(char *src_picture,char *dest_picture,int sk_cnt){ bpFile_Header src_fheader; bpINFO_HEADER src_header; int src_cnt = 0,dest_cnt = 0,cnt=0; //打开原图像 FILE *src_fp = fopen(src_picture,"rb"); if(src_fp == NULL){ printf("open src_picture failed\n "); return false; } //打开目标图像 FILE *dest_fp = fopen(dest_picture,"wb+"); if(dest_fp == NULL){ printf("open dest_picture failed\n "); return false; } bpFile_Header dest_fheader; bpINFO_HEADER dest_header; //获取原图像信息 // fseek(src_fp,14,SEEK_SET); fread(&src_fheader,1,14,src_fp); fread(&src_header,1,40,src_fp); short data=0; //初步设置目标文件信息头信息 dest_fheader = src_fheader; dest_header = src_header; //计算目标图像需要补齐的字节数目 dest_cnt = ((4-(src_header.bpWidth/sk_cnt*24/8)%4)%4); //计算源图像补齐的字节数目 src_cnt = ((4-(src_header.bpWidth*24/8)%4)%4); //界说存储数据的数组 char info_buf[src_header.bpWidth*3],middata; printf("%d\n",src_cnt); printf("%d\n",src_header.bpWidth); printf("%d\n",src_header.bpHeight); //向目标文件写入文件信息 fwrite(&src_fheader,14,1,dest_fp); fwrite(&src_header,40,1,dest_fp); fseek(dest_fp,0,SEEK_SET); fread(&dest_fheader,1,14,dest_fp); fread(&dest_header,1,40,dest_fp); //设置目标文件信息头信息 dest_fheader.bfSize = (src_header.bpWidth/sk_cnt + dest_cnt)*src_header.bpHeight / sk_cnt; dest_header.bpWidth = src_header.bpWidth/sk_cnt; dest_header.bpHeight = src_header.bpHeight/sk_cnt; //dest_header.bpSizeImage = src_header.bpSizeImage/4; fseek(dest_fp,0,SEEK_SET); fwrite(&dest_fheader,1,14,dest_fp); fwrite(&dest_header,1,40,dest_fp); printf("%8ld",ftell(dest_fp)); //fseek(src_fp,54,SEEK_SET); //逐行进行 for(int heigth = 0; heigth
|