C语言实现单色位图的放大
一般网上很少有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语言实现单色位图的放大相关推荐
- C语言实现生成二维码的单色位图
硬件环境: Arm 移植过二维码的库qrencode 本文主要是实现一种单色位图的二维码的生成,前期需要自己移植二维码的库,下面就是具体的生成代码,主要流程就是将二维码库函数生成的数据放到自 ...
- C语言实现BMP图片的放大缩小
C语言实现BMP图片的放大缩小 BMP图片简介:BMP图片是windows操作系统中的标准图像文件格式,可以分为两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛.它采用位映射存储格式,除 ...
- 绘制一张透明背景的单色位图
在上一篇文章中,我留下了一个谜题:如何使用透明背景绘制一张单色位图.今天我们来揭晓谜底. 丑话说前头,我不是一名 GDI 方面的专家,所以,除了下面讲述的两种方法之外,可能还有我所不知道的更好的解决方 ...
- linux下将8bit二值位图转化为1bit单色位图【C/C++】
linux下将8bit二值位图转化为1bit单色位图 bmp位图主要由文件头和信息头两部分,根据windows api下bmp结构体定义,可转化为以下linux可用的结构体(禁用了gcc/g++编译器 ...
- java生成bmp单色位图,关于GDI+生成单色BMP图片的问题,请高手进!
用GDI+生成的BMP图片颜色位数一般都是24位,我要怎样生成1位的BMP图片呢? 我在网上找了几种方法,有的方法效果是达到了,但是效率非常低,我是要生成几万张甚至几十万张的,所以要求速度要够快. 不 ...
- 单色位图、16色位图、256色位图的含义
在WIndows下的画图工具中绘制完图片后,另存为的时候有以下几种选项: 这些分别代表什么含义呢? 单色位图: 每个像素最多可以表示2种颜色,只需要使用长度为1的二进制位来表示,因此每个像素占1/8b ...
- 69 RGB图像转单色位图
1 前言 前段时间搞了一下电子墨水屏显示项目,用的这款墨水屏不能直接显示彩色图.灰度图及二值图,需要将图像转换成单色位图才能显示. 单色位图这还是第一次接触,后面看了资料了解到单色位图和二值图类似.二 ...
- c语言处理单色bmp文件,C语言处理单色BMP文件
使用C 语言获得黑白BMP文档的参数而不使用其他函数. 使用C处理单色BMP照片 首先要了解BMP文件的格式: BMP图片的扫描方式 是从左到右,从下至上,对每个像素取值.一个扫描行所占的字节数为4的 ...
- C语言实现BMP图片的放大缩小-24位
bmp的缩放 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef unsigned cha ...
最新文章
- redis的主从复制,读写分离,主从切换
- mysql复制架构迁移到pxc_mysql复制(高可用架构方案的基础)
- LeetCode题组:第206题-反转链表
- python与c混合编程 版本_python与C、C++混编的四种方式(小结)
- iOS开发(1)写在前面的话
- boost::icl模块实现测试 shell 来分割区间图
- shell:判断一个进程是否存在
- html+css+js实现科学计算器
- 计算机语言php自学,php自学需要多久?
- 【luogu P1156 垃圾陷阱】 题解
- 工具-VS插件Resharper快捷键
- 金鹏GB28181平台对接
- selenium-webdriver——让chrome跑起来
- JavaScript实现按钮点击上/下一张切换图片
- librdkafka
- AdventureWorks DW事例数据库下载
- 如何快速发表一篇SCI论文
- 微软再出神器,这次终于对Python下手了!
- 【读书联动】认知觉醒:开启自我改变的原动力
- 你真正做到敏捷了吗?