如何使用bmp位图制作字符画
来源:互联网 发布:世界进出口数据 编辑:程序博客网 时间:2024/04/29 17:32
前言
最近有个大胆的想法,就是用C语言将bmp图转变为字符画,大概的原理就是将每个像素点转变为灰度不同的字符,然后我便开始了研究
原理
BMP图又称为Bitmap位图,是Windows系统的一种图像文件格式,其中的数据根据官方文档可以分为四部分:
结构
从网上搜寻到的图片可知
bmp file header的详细内容为
而bmp information的部分有用内容为
接着调速板就是一张映射表,我们根据位图数据来确定每一个像素点的颜色
注意点
除此以外,还要注意的东西有对齐规则和bmp的类型
代码
#include <stdio.h>#include <stdbool.h>#include <stdlib.h>#pragma pack(2)typedef unsigned short WORD;typedef unsigned int DWORD;typedef unsigned char BYTE;typedef struct BMP_FILE_HEADER{ WORD bType; DWORD bSize; WORD bReserved1; WORD bReserved2; DWORD bOffset; } BMPFILEHEADER;typedef struct BMP_INFO{ DWORD bInfoSize; DWORD bWidth; DWORD bHeight; WORD bPlanes; WORD bBitCount; DWORD bCompression; DWORD bmpImageSize; DWORD bXPelsPerMeter; DWORD bYPelsPerMeter; DWORD bClrUsed; DWORD bClrImportant; } BMPINFO;typedef struct BGR_INFO{ BYTE blue; BYTE green; BYTE red;}BGRINFO;#define NUM_CHAR 20BMPFILEHEADER bmpFileHeader;BMPINFO bmpInfo;BGRINFO bgrinfoTest;//char ch[71]="$@B%8&WM#*ZO0QLCJUYXoahkbdpqwmzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ";char ch[NUM_CHAR+1]="@Po;:+=~-*^\"`',. ";int main(int argc,char *argv[]){ FILE *fp,*fp1; if((fp=fopen("4.bmp","rb"))==NULL){ printf("要转换的图片不存在"); exit(EXIT_FAILURE); } if((fp1=fopen("4.txt","w"))==NULL){ printf("存照片文档不存在"); exit(EXIT_FAILURE); } fseek(fp,0,0); fread(&bmpFileHeader,sizeof(BMPFILEHEADER),1,fp); fread(&bmpInfo,sizeof(BMPINFO),1,fp); BGRINFO bgrinfo[bmpInfo.bWidth][bmpInfo.bHeight]; int color[bmpInfo.bWidth][bmpInfo.bHeight]; int grey; int useless=(bmpInfo.bWidth*3%4==0)?0:(4-bmpInfo.bWidth*3%4); printf("%d %d",bmpInfo.bWidth,bmpInfo.bHeight); for(int j=0;j<bmpInfo.bHeight;j++){ for(int i=0;i<bmpInfo.bWidth;i++){ fread(&bgrinfo[i][j],sizeof(BGRINFO),1,fp); grey=(bgrinfo[i][j].blue*11+bgrinfo[i][j].green*59+bgrinfo[i][j].red*30+50)/100; color[i][bmpInfo.bHeight-j-1]=grey; } fseek(fp,useless,SEEK_CUR); } for(int j=0;j<bmpInfo.bHeight;j++){ for(int i=0;i<bmpInfo.bWidth;i++){ fprintf(fp1,"%c%c",ch[(NUM_CHAR-1)*color[i][j]/255],ch[8*color[i][j]/255]); } fprintf(fp1,"\n"); } fclose(fp); fclose(fp1); return 0;}
效果图
阅读全文
0 0
- 如何使用bmp位图制作字符画
- 利用bmp位图制作ICO
- 利用bmp位图制作ICO
- 使用vc显示bmp位图
- 使用vc显示bmp位图
- 使用SDL_Surface显示BMP位图
- 字符图标如何制作,使用
- 使用16位汇编显示bmp位图
- mfc中使用bmp和png位图
- win32SDK中使用bmp和png位图
- 使用C++读取8位BMP位图
- 如何将位图对象保存为BMP文件
- Android的jni层如何加载bmp位图
- 绘制BMP位图文件
- bmp位图的文件格式
- BMP位图操作
- bmp位图文件格式
- BMP位图操作c++
- error1 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 无法启动导致tomcat
- nginx配置ca证书
- php5.6+Redis+Windows7安装 (phpstudy)
- request.getRequestDispatcher().forward(request,response)和response.sendRedirect()的区别
- HTML5 登录框设计
- 如何使用bmp位图制作字符画
- DataFrame基础用法2
- andriod——自定义拦截器post请求数据
- RCA(Root Cause Analysis)总结
- Codeforces 894B Ralph And His Magic Field
- ubuntu libpcap安装流程
- 多线程编程中的Master-Worker模式
- 车牌识别系统
- ArcGIS 连接postgreSQL数据库发布要素服务