首先我本先了解一下BMP图片的格式。

BMP文件主要分为如下4个部分: 块名称

对应Windows结构体定义                                                    大小(Byte)

文件信息头 BITMAPFILEHEADER                  14

位图信息头 BITMAPINFOHEADER                  40

颜色表(调色板)RGBQUAD                   (可选)

位图数据(RGB颜色阵列) BYTE* 由图像长宽尺寸决定 第1~2位:424dh = 'BM',表示这是Windows支持的位图格式。

第3~5位:代表文件大小。如00010436h = 66614 B = 65.05 kB

第6~9位:保留段,为0。

第A~D位:即从文件头到位图数据需偏移字节数。

共14字节。

0E~11:00000028h = 40,这个位图信息头的大小为40个字节。

12~15:图片宽度。(像素)

16~19:图片高度。(像素)

1A~1B:0001h。

1C~1D:0008h,代表每个像素占8比特。

1E~21:00000000h,代表图像不压缩。

22-25:00000000h。

26-29:00000000h。

2A-2D:00000000h。

2E-31:00000100h=256,说明本位图实际使用的颜色索引数为256。

32-35:00000100h=256,说明本位图重要的颜色索引数为256。

位图数据(RGB颜色阵列)就是我们给入的图像阵列,本程序是从ASC16点阵字库中取得。

注意:linux汉字使用的是utf-8,如果从HZK16点阵字库中取得汉字阵列需要转化成GB2321码,本文不做讲解。

注:

int GenBmpFile(char *pData, char bitCountPerPix, int width, int height, const char *filename) 生成BMP图片函数以及对应的结构体是从

http://www.cnblogs.com/shengansong/archive/2011/09/23/2186409.html摘抄而来,具体可转此连接查看。

PutBMP(FILE *fp16,char *str) 函数是将数组中的数字的ASCII码乘以16获取数字在字库中的区位码,获取改数字的阵列,赋值给RGB结构体,最后通过GenBmpFile()函数生成对应数字的bmp图片。

#include

#include

#include

#pragma pack(push, 1)

typedef struct tagBITMAPFILEHEADER

{

short bfType;

int bfSize;

short bfReserved1;

short bfReserved2;

int bfOffBits;

} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER

{

int biSize;

int biWidth;

int biHeight;

short biPlanes;

short biBitCount;

int biCompression;

int biSizeImage;

int biXPelsPerMeter;

int biYPelsPerMeter;

int biClrUsed;

int biClrImportant;

} BITMAPINFOHEADER;

typedef struct tagRGBQUAD

{

char rgbBlue;

char rgbGreen;

char rgbRed;

char rgbReserved;

} RGBQUAD;

typedef struct tagBITMAPINFO

{

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[1];

} BITMAPINFO;

typedef struct tagBITMAP

{

BITMAPFILEHEADER bfHeader;

BITMAPINFO biInfo;

}BITMAPFILE;

#pragma pack(pop)

int GenBmpFile(char *pData, char bitCountPerPix, int width, int height, const char *filename)

{

FILE *fp = fopen(filename, "wb");

if(!fp)

{

printf("fopen failed : %s, %d\n", __FILE__, __LINE__);

return 0;

}

int bmppitch = ((width*bitCountPerPix + 31) >> 5) << 2;

int filesize = bmppitch*height;

BITMAPFILE bmpfile;

bmpfile.bfHeader.bfType = 0x4D42;

bmpfile.bfHeader.bfSize = filesize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

bmpfile.bfHeader.bfReserved1 = 0;

bmpfile.bfHeader.bfReserved2 = 0;

bmpfile.bfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

bmpfile.biInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bmpfile.biInfo.bmiHeader.biWidth = width;

bmpfile.biInfo.bmiHeader.biHeight = height;

bmpfile.biInfo.bmiHeader.biPlanes = 1;

bmpfile.biInfo.bmiHeader.biBitCount = bitCountPerPix;

bmpfile.biInfo.bmiHeader.biCompression = 0;

bmpfile.biInfo.bmiHeader.biSizeImage = 0;

bmpfile.biInfo.bmiHeader.biXPelsPerMeter = 0;

bmpfile.biInfo.bmiHeader.biYPelsPerMeter = 0;

bmpfile.biInfo.bmiHeader.biClrUsed = 0;

bmpfile.biInfo.bmiHeader.biClrImportant = 0;

fwrite(&(bmpfile.bfHeader), sizeof(BITMAPFILEHEADER), 1, fp);

fwrite(&(bmpfile.biInfo.bmiHeader), sizeof(BITMAPINFOHEADER), 1, fp);

char *pEachLinBuf = (char*)malloc(bmppitch);

memset(pEachLinBuf, 0, bmppitch);

char BytePerPix = bitCountPerPix >> 3;

int pitch = width * BytePerPix;

if(pEachLinBuf)

{

int h,w;

for(h=height-1; h>=0; h--)

{

for(w=0; w

{

//copy by a pixel

pEachLinBuf[w*BytePerPix+0] = pData[h*pitch + w*BytePerPix + 0];

pEachLinBuf[w*BytePerPix+1] = pData[h*pitch + w*BytePerPix + 1];

pEachLinBuf[w*BytePerPix+2] = pData[h*pitch + w*BytePerPix + 2];

}

fwrite(pEachLinBuf, bmppitch, 1, fp);

}

free(pEachLinBuf);

}

fclose(fp);

return 1;

}

typedef struct _LI_RGB

{

char b;

char g;

char r;

}LI_RGB;

int PutBMP(FILE *fp16,char *str)

{

const unsigned char bit[8]={128,64,32,16,8,4,2,1};

int x,y,wid;

int WIDTH=strlen(str)*8,HEIGHT=16;

long len;

char buf[32];

LI_RGB pRGB[HEIGHT][WIDTH]; // 定义位图数据

memset(pRGB, 0XFF, sizeof(pRGB)); // 设置背景为白色

for(wid=0;wid

{

len=str[wid]*16;

fseek(fp16,len,SEEK_SET);

fread(buf,1,16,fp16);

for (y=0;y<16;y++)

{

for (x=0;x<8;x++)

{

if (buf[y+x/8]&bit[x%8])

{

pRGB[y][wid*8+x].b = 0x00;

pRGB[y][wid*8+x].g = 0x00;

pRGB[y][wid*8+x].r = 0x00;

}

}

}

}

GenBmpFile((char*)pRGB, 24, WIDTH, HEIGHT, "out.bmp");//生成BMP文件

return 1;

}

int main(char argc, char *argv[])

{

char buf[30]={"2014/10/15 17:06"};

FILE *fd = fopen("ASC16", "rb");

if(!fd)

{

printf("fopen failed : %s, %d\n", __FILE__, __LINE__);

return 0;

}

PutBMP(fd,buf);

fclose(fd);

return 1;

}

这是最终程序生成的out.bmp图片。

——————————海鱼

linux bmp添加字符,linux 将数字符号画到BMP图片上相关推荐

  1. linux lvm添加磁盘,Linux下添加磁盘创建lvm分区

    shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle a bootab ...

  2. linux系添加路由,Linux添加路由的两种方法

    Linux中增加软路由的两种方法 第一种: route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0 /* 增加 ...

  3. linux命令 添加用户,Linux添加用户命令

    Linux是一个多用户.多任务操作系统.多用户是指允许多人在Linux中创建独立的账户来确保用户个人数据的安全性.独立性.因此在Linux中添加用户就是系统管理员的日常基本工作了.其实添加用户命令也是 ...

  4. linux twiki 添加权限,Linux安装TWiki

    听说twiki是一个很好的管理知识的工具,今天我们就来安装体验一下. 1.安装apache2 apt-get install apache2或者yum install httpd 2.下载twiki ...

  5. linux 隔行添加字符,EXCEL 隔行插入空白行、批量添加字符 等技巧备份

    在整理俱乐部08年的帖子,如果手工做的话绝对会疯的.EXCEL是好物,可惜俺只会简单的操作,对函数.宏完全不懂,今晚百度出来一系列不合适里面挑了几个适合我用的excel技巧,马克如下,以后备用. 一. ...

  6. linux遇到nul字符,linux TXT文件操作 '^@ ' 'NUL' 符号乱码问题

    项目需求需要向TXT文件中写分钟数据, 也就是一分钟写一次, 一次一帧数据 ,一帧数据一行. 下面简单的贴下自己测试时的代码,  AWS_MIN1_DATA是一分钟数据结构体 (memset(& ...

  7. linux php添加防火墙,linux防火墙iptables初学者教程

    Iptables是专为Linux操作系统打造的极其灵活的防火墙工具.对Linux极客玩家和系统管理员来说,iptables非常有用.本文将向你展示如何配置最通用的Linux防火墙. 关于iptable ...

  8. linux convert 添加文字,Linux convert命令有什么用

    Linux convert命令有什么用? Linux强大的图片处理功能 强大的convert命令---介绍他的主要原因也是应为编程语言在linux下都可以调用使用 convent命令可以对图片进行各种 ...

  9. linux内核添加模块,linux中添加内核模块

    1.  内核模块简介 Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢? 方 法 一 : 把 所有的 组 件都 编译 进 内 ...

最新文章

  1. python用for循环一直出现最后一个值_python中for循环的list最后一个数据总会覆盖前面的数据...
  2. grub设置密码的方法
  3. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
  4. 蚂蚁变大象:浅谈常规网站是如何从小变大的(转)
  5. c 求最小公倍数_公务员备考-最小公倍数和最小公约数问题
  6. 干货整理:处理不平衡数据的技巧总结!收好不谢
  7. php调用文章标题,zblogphp标题格式的标签调用详细说明
  8. Ubuntu下Eclipse中文乱码解决
  9. Thingsboard 3.1.0 - REST API
  10. 灵感专题—2019年优秀网页设计作品赏析#5月
  11. M0、M1、M2、M3
  12. 【java】使用一维数组实现评委打分功能
  13. maven、gradle 设置MANIFEST.MF配置
  14. Spring事务管理中异常回滚知识点总结
  15. 商业模式新生代_精读商业模式新生代之“多边平台式商业模式”
  16. matlab 色块图,matlab绘制矩阵色块图
  17. 【Windows】windows10自己下载安装的主题壁纸位置
  18. 杰理之ANC头戴式降噪电路预留【篇】
  19. 从零开始打造一个Android 3D立体旋转容器
  20. 数据库常考填空题合集

热门文章

  1. DB2日常运维之总结
  2. c++几何类和几何简单工厂模式
  3. 2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)
  4. DWG文件版本如何转换?这两种转换小技巧了解一下
  5. unity,第三人称射击游戏的摄像机实现
  6. 抢票季:吐槽12306 分享抢票经验
  7. jquery点击按钮切换样式
  8. Lambda表达式和Stram流组合一个高效用法(遍历集合)
  9. 2019安全生产模拟考试一点通在线模拟操作
  10. 敏捷项目管理之每日晨会的重要性分析