一般网上很少有C语言实现单色位图的放大程序,下面主要是通过C来实现单色位图的放大

#define FXZOOMRATIO 5.8   //x轴放大倍数
#define FYZOOMRATIO 5.8   //y轴放大倍数#pragma pack(push, 2)typedef struct
{WORD    bfType;DWORD   bfSize;WORD    bfReserved1;WORD    bfReserved2;DWORD   bfOffBits;
} BITMAPFILEHEADER;typedef struct
{DWORD      biSize;LONG       biWidth;LONG       biHeight;WORD       biPlanes;WORD       biBitCount;DWORD      biCompression;DWORD      biSizeImage;LONG       biXPelsPerMeter;LONG       biYPelsPerMeter;DWORD      biClrUsed;DWORD      biClrImportant;
} BITMAPINFOHEADER;typedef struct tagRGBQUAD
{BYTE rgbBlue;//蓝色的亮度(值范围为0-255)BYTE rgbGreen;//绿色的亮度(值范围为0-255)BYTE rgbRed;//红色的亮度(值范围为0-255)BYTE rgbReserved;//保留,必须为0
}RGBQUAD;#pragma pack(pop)unsigned char *pBmpBuf;   //读入图像数据的指针unsigned char *pNewBmpBuf;int    bmpWidth;       //图像的宽int   bmpHeight;      //图像的高int   g_lineByte;     //放大之前每行的字节数RGBQUAD *pColorTable;   //颜色表指针int  biBitCount;     //图像类型,每像素位数long newBmpWidth;    //变化后图像的宽long   newBmpHeight;   //变化后图像的高long   newLineByte;    //变化后图像数据每行的字节数/*****************************************************************************函数名称:readBmp()*函数参数:const char *bmpName 读入bmp格式文件的路径及名称*函数返回值:0为失败 1为成功*函数描述:给定文件的名称和路径 读入图像的位图数据,宽,高,及每个像素的位数进内存,保存在全局变量中****************************************************************************/bool readBmp(const char* bmpName){FILE *fp=fopen(bmpName,"rb");if(fp==0){printf("cannot open file");return 0;}fseek(fp,sizeof(BITMAPFILEHEADER),0);BITMAPINFOHEADER head;fread(&head,sizeof(BITMAPINFOHEADER),1,fp);/*读取位图的长宽和深度*/bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount; int iexwidth = bmpWidth;if(bmpWidth % 8){iexwidth += 8;}iexwidth /= 8;   g_lineByte = (iexwidth + 3) & ~0x03; //计算每行的字节数,必须是4的倍数if(biBitCount == 1){pColorTable =(RGBQUAD *)malloc(sizeof(RGBQUAD)*2);fread(pColorTable,sizeof(RGBQUAD),2,fp);  //读取调色板信息         单色位图两个调色板}pBmpBuf = (unsigned char *)malloc(g_lineByte *bmpHeight); //申请颜色数据区fread(pBmpBuf,1,g_lineByte *bmpHeight,fp);fclose(fp);return 1;}bool saveBmp(const char* bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD *pColorTable)
{if(!imgBuf)        //要保存的颜色数据return 0;int colorTablesize = 0;if(biBitCount == 1)colorTablesize =8; //计算调色板的大小          4*2int lineByte = newLineByte;FILE *fp = fopen(bmpName,"wb");if(fp == 0) return 0;BITMAPFILEHEADER fileHead;fileHead.bfType= 0x4d42;fileHead.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte *height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;fileHead.bfOffBits = 54 +colorTablesize;fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head.biBitCount = biBitCount;head.biClrImportant = 0;head.biClrUsed = 0;head.biCompression = 0;head.biHeight = height;head.biPlanes =1;head.biSize = 40;head.biSizeImage = lineByte *height;head.biWidth = width;head.biXPelsPerMeter = 0;head.biYPelsPerMeter = 0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);if(biBitCount == 1){fwrite(pColorTable,sizeof(RGBQUAD),2,fp);}fwrite(imgBuf,height * lineByte,1,fp);fclose(fp);return 1;
} /*****************************************************************************函数名称: bmpzoom()*函数参数: const char* szSrcBmp 原bmp图片的路径及名称const char* szDstBmp 变化后保存bmp图片后的文件路径及名称*函数返回值:0为失败 1为成功*函数描述: 传入图片变化比例系数参数FXZOOMRATIO和FYZOOMRATIO 实现图片放大缩小****************************************************************************/bool bmpzoom(const char* szSrcBmp, const char* szDstBmp)
{    readBmp(szSrcBmp);newBmpWidth =  (long) (bmpWidth  * FXZOOMRATIO);    //计算放大过后长宽newBmpHeight = (long) (bmpHeight * FYZOOMRATIO);int iexwidth = newBmpWidth;if(bmpWidth % 8){iexwidth += 8;}iexwidth /= 8;     newLineByte = (iexwidth + 3) & ~0x03;pNewBmpBuf = (unsigned char*)malloc(newLineByte * newBmpHeight);   //申请新的颜色数据指针memset(pNewBmpBuf,0,newLineByte * newBmpHeight);    //首先全清0 纯黑long i,j,k;long i0,j0;if(biBitCount==1){for(i = 0;i < newBmpHeight;i++){for(j = 0; j<newBmpWidth;j++){i0 = (long)(i/FYZOOMRATIO); j0 = (long)(j/FXZOOMRATIO);int inewbit = j % 8;int inewbyte = j / 8;int ibit =  j0 % 8;int ibyte = j0 / 8;if((j0 >=0) && (j0 < bmpWidth) && ((i0 >=0)&& (i0 <bmpHeight))){    //按照比例系数,按位取数据     if(*(pBmpBuf+i0*g_lineByte+ibyte) & (unsigned char)(0x80 >> ibit)){  //白色 1*(pNewBmpBuf+i*newLineByte+inewbyte) |= (unsigned char)(0x80 >> inewbit);    //对应的位取1}}                      }}  }saveBmp(szDstBmp,pNewBmpBuf,newBmpWidth,newBmpHeight,biBitCount,pColorTable);  //将赋值过后的颜色指针保存至新图片if(pNewBmpBuf != NULL){free(pNewBmpBuf);pNewBmpBuf = NULL;}if(pBmpBuf != NULL){free(pBmpBuf);pBmpBuf = NULL;}if(biBitCount == 1){if(pColorTable != NULL){free(pColorTable);pColorTable = NULL;}    }  return 1;}

C语言实现单色位图的放大相关推荐

  1. C语言实现生成二维码的单色位图

    硬件环境: Arm      移植过二维码的库qrencode 本文主要是实现一种单色位图的二维码的生成,前期需要自己移植二维码的库,下面就是具体的生成代码,主要流程就是将二维码库函数生成的数据放到自 ...

  2. C语言实现BMP图片的放大缩小

    C语言实现BMP图片的放大缩小 BMP图片简介:BMP图片是windows操作系统中的标准图像文件格式,可以分为两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛.它采用位映射存储格式,除 ...

  3. 绘制一张透明背景的单色位图

    在上一篇文章中,我留下了一个谜题:如何使用透明背景绘制一张单色位图.今天我们来揭晓谜底. 丑话说前头,我不是一名 GDI 方面的专家,所以,除了下面讲述的两种方法之外,可能还有我所不知道的更好的解决方 ...

  4. linux下将8bit二值位图转化为1bit单色位图【C/C++】

    linux下将8bit二值位图转化为1bit单色位图 bmp位图主要由文件头和信息头两部分,根据windows api下bmp结构体定义,可转化为以下linux可用的结构体(禁用了gcc/g++编译器 ...

  5. java生成bmp单色位图,关于GDI+生成单色BMP图片的问题,请高手进!

    用GDI+生成的BMP图片颜色位数一般都是24位,我要怎样生成1位的BMP图片呢? 我在网上找了几种方法,有的方法效果是达到了,但是效率非常低,我是要生成几万张甚至几十万张的,所以要求速度要够快. 不 ...

  6. 单色位图、16色位图、256色位图的含义

    在WIndows下的画图工具中绘制完图片后,另存为的时候有以下几种选项: 这些分别代表什么含义呢? 单色位图: 每个像素最多可以表示2种颜色,只需要使用长度为1的二进制位来表示,因此每个像素占1/8b ...

  7. 69 RGB图像转单色位图

    1 前言 前段时间搞了一下电子墨水屏显示项目,用的这款墨水屏不能直接显示彩色图.灰度图及二值图,需要将图像转换成单色位图才能显示. 单色位图这还是第一次接触,后面看了资料了解到单色位图和二值图类似.二 ...

  8. c语言处理单色bmp文件,C语言处理单色BMP文件

    使用C 语言获得黑白BMP文档的参数而不使用其他函数. 使用C处理单色BMP照片 首先要了解BMP文件的格式: BMP图片的扫描方式 是从左到右,从下至上,对每个像素取值.一个扫描行所占的字节数为4的 ...

  9. C语言实现BMP图片的放大缩小-24位

    bmp的缩放 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef unsigned cha ...

最新文章

  1. redis的主从复制,读写分离,主从切换
  2. mysql复制架构迁移到pxc_mysql复制(高可用架构方案的基础)
  3. LeetCode题组:第206题-反转链表
  4. python与c混合编程 版本_python与C、C++混编的四种方式(小结)
  5. iOS开发(1)写在前面的话
  6. boost::icl模块实现测试 shell 来分割区间图
  7. shell:判断一个进程是否存在
  8. html+css+js实现科学计算器
  9. 计算机语言php自学,php自学需要多久?
  10. 【luogu P1156 垃圾陷阱】 题解
  11. 工具-VS插件Resharper快捷键
  12. 金鹏GB28181平台对接
  13. selenium-webdriver——让chrome跑起来
  14. JavaScript实现按钮点击上/下一张切换图片
  15. librdkafka
  16. AdventureWorks DW事例数据库下载
  17. 如何快速发表一篇SCI论文
  18. 微软再出神器,这次终于对Python下手了!
  19. 【读书联动】认知觉醒:开启自我改变的原动力
  20. 你真正做到敏捷了吗?

热门文章

  1. IE8浏览器无法上传附件的解决方案以及相关兼容问题
  2. 大疆无人机5G图传 无人机视频回传指挥中心 WB7000MD-3K
  3. 《麦肯锡方法》读书笔记19
  4. 2021-11-12除了更改兼容性以外放大应用界面字体的方法
  5. 水电站项目远程监管系统
  6. 组建比较不只有箱线图,还有这些
  7. 配置酷酷的Windows Powershell
  8. 已知原函数和导函数的关系_原函数和导函数的关系
  9. 一个震惊了整个德国的动人故事 (转)
  10. 固瑞克机器人电焊密封胶胶枪枪嘴_胶枪的使用方法