文件IO-图像缩小

打印 上一主题 下一主题

主题 1430|帖子 1430|积分 4290

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
将一个bmp图像进行缩小,缩小后的图像不失真
  1. /********************************************************************************
  2. *
  3. *
  4. * 设计图片等比例不失真缩小的接口
  5. * author:jindouliu2024@163.com
  6. * date:2025.4.19
  7. *
  8. *
  9. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  10. * ****************************************************************************/
复制代码
[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
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表