一、背景

做单色lcd 点阵屏幕显示开发的时候,当要显示图片时,我们先要将图片通过取模软件转换成单片机可读的ascii 数据。emwin 等成熟方案,用户只需要导入一张bmp格式的图片,然后点击几下,就可以生成代码可以直接调用的字模数据文件,例如bmp_buzz.c ; bmp_buzz.h 。但是emwin 本身不开源,占用flash 空间也大,对低成本方案不友好。

我要实现的

自己编写gui驱动框架,实现点、线、字、图等的绘制,利用pctolcd2002 进行字体和图片的取模。编写shell脚本,一键将取模软件生成的图片数据生成可以直接使用的图片描述文件。

二、pctolcd2002 输出的bmp字模文件分析

图一
如图,我们程序中真正需要用到的是图片点阵数据,和图片的宽和高。

三、实现

3.1 写好bmp数据文件的模板文件

bmp 数据源文件

bmp 数据头文件

3.2 实现思路

从pctolcd2002 生成的图片字模文件提取出点阵数据(数组),图片的宽(像素),图片的高(像素),从模板文件复制出一份新的文件,然后将对应的数据替换,插入到其中。

3.3 脚本实现

generate_bmp_data.sh

#!/bin/bashfile_create_by_pctolcd2002=$1
new_bmp_name=$2if [ $# -lt 2 ] ; thenecho "please input bmp src file name!"echo "please input bmp new file name!"exit 1
fifirst_line_to_insert_bmp_data=5echo $new_bmp_name#------------ 1: get bmp width and height from src file  ----------------
#filter bmp file size:width and height
#eg: format( 9 X 12)#get width and height data ; remove (,)
bmp_size=$(grep -o "(.*X.*)" $file_create_by_pctolcd2002 | sed 's/(//g' | sed 's/)//g')
new_bmp_width=$(echo $bmp_size|cut -f 1 -d X)
new_bmp_height=$(echo $bmp_size|cut -f 2 -d X)echo "new_bmp_name:"$new_bmp_name
echo "bmp_width:"$new_bmp_width
echo "bmp_height:"$new_bmp_height#------------ 2:  generate new bmp src file from template file----------------
new_src_file="bmp_"$new_bmp_name".c"
new_h_file="bmp_"$new_bmp_name".h"cp ./bmp_name.cfile  $new_src_file
cp ./bmp_name.header  $new_h_file
echo "new_h_file:"$new_h_file#replace bmp src name
sed -i 's/name/'"$new_bmp_name"'/g' $new_src_file
#replace bmp header name
sed -i 's/name/'"$new_bmp_name"'/g' $new_h_file#upper case new_file_name
upper_bmp_name=$(echo $new_bmp_name| tr 'a-z' 'A-Z')#replace macro definition
sed -i 's/NAME/'"$upper_bmp_name"'/g' $new_h_file#replace bmp width
sed -i 's/bmp_width/'"$new_bmp_width"'/g' $new_src_file#replace bmp height
sed -i 's/bmp_height/'"$new_bmp_height"'/g' $new_src_file#------------ 3: get available data from temp file ------------------------  #remove first line
# sed -i '1d' $file_create_by_pctolcd2002
sed -ie '/(0)/d' $file_create_by_pctolcd2002# remove  empty line
sed -i '/^\s*$/d' $file_create_by_pctolcd2002#remove note line
sed -i 's/\/.*\///g' $file_create_by_pctolcd2002# remove { and }
sed -i 's/{//g' $file_create_by_pctolcd2002
sed -i 's/}//g' $file_create_by_pctolcd2002sed -i ''"$first_line_to_insert_bmp_data"'r '"$file_create_by_pctolcd2002"'' $new_src_file#-------------------------4: new file format --------------------------------
dos2unix $new_src_file
dos2unix $new_h_fileastyle $new_src_file
astyle $new_h_file

3.4 脚本流程分析

3.4.1 从bmp 字模数据源文件,提取bmp 宽和高

  • bmp 宽和高的描述格式是(数字 X 数字),利用grep 工具结合正则表达式,grep 的 -o 参数 表示直接返回匹配的数据,而非一整行,节省了工作量。
  • 利用cut 工具,以分隔为 X 进行切割,切割到的第一个数据为bmp的宽,第二个为高

3.4.2 根据模块文件,生成新的bmp数据文件,更新bmp宽和高

这部分主要是利用sed 工具的字符串替换功能。sed -i 's/old_exp/new_exp/g' file_name , 其中,当old_expnew_exp 为变量时,需要注意引号的使用,sed 工具才能正确解析。例如: sed -i 's/old_exp/ '" $new_exp_var"' file_name

3.4.3 删除bmp字模数据源文件的无用数据,提取图片点阵数组

  • 第一行数据描述文件的路径。可以用sed 工具直接删除第一行。这里的做法是识别第一行的表达式特征(0) ,进行删除
    sed -i '/(0)/d' $file_create_by_pctolcd2002
  • 删除空行
    sed -i ' /^\s*$/d' $file_create_by_pctolcd2002
  • 删除注释部分(/*abaga*/ )
    sed -s 's/\/.*\///g' $file_create_by_pctolcd2002
  • 删除字符{}
  • 利用sed 工具,将$file_create_by_pctolcd2002 经过处理后,剩下的点阵数组,插入到bmp 数据文件指定行。
    示例,将a.file 文件插入到b.file 的指定行
    sed -i ' 4 r a.file ' b.file

3.4.4 格式化最终的文件

3.5 用户使用

这个脚本需要传入两个参数:
参数1: 取模软件生成的bmp 字模数据文件,如上图一
参数2: 程序中对这个bmp 图片命名,例如:buzzer,bat

./generate_bmp_data.sh src_file buzzer
生产的bmp 数据文件如下:

一键将pctolcd2002 生成的bmp 字模数据生成程序可以直接调用的字模文件相关推荐

  1. Ansys节点数据批量一键导出脚本生成CSV (ansys数据导出利用matlab脚本)

    由于ANSYS软件本身的数据后处理.绘图等功能有限,我们常常需要把ansys模拟后的结果数据导出以做进一步的处理分析.为此作者编写了matlab平台的m/p脚本,使得ansys的lis文件可以一键生成 ...

  2. OLED显示字符的大小与PCtoLCD2002生成字模

    OLED显示字符的大小与PCtoLCD2002生成字模 首次尝试性写博客,如果错误或不足请大家指正 如有涉及相关版权的问题,联系我删除 前言: 为什么为了一个小小的OLED写这些乱七八糟的东西,还得花 ...

  3. 用Python一键生成微信个人专属数据报告,了解你的微信社交历史

    简介 你是否想过生成一份属于你的微信个人数据报告,了解你的微信社交历史.现在,我们基于python对微信好友进行全方位数据分析,包括:昵称.性别.年龄.地区.备注名.个性签名.头像.群聊和公众号等. ...

  4. 8.一键生成微信个人专属数据报告(了解你的微信社交历史)

    1.你是否想过生成一份属于你的微信个人数据报告,了解你的微信社交历史.现在,我们基于python对微信好友进行全方位数据分析,包括:昵称.性别.年龄.地区.备注名.个性签名.头像.群聊.公众号等. 其 ...

  5. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  6. Bitmap文件格式+生成一个BMP文件

    Bitmap的文件格式: 1 #define UINT16 unsigned short 2 #define DWORD unsigned int 3 #define WORD short 4 #de ...

  7. 国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由

    原文链接:全球首发,国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由 去年4月,OpenAI发布的DALL-E 2用更高的分辨率.更真实的图像生成以及更准确地理解自然描述,横扫整个A ...

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

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

  9. C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图

    最终效果: V1.8.2 20230419 文字生成单色BMP图片4.exe 默认1280*720  如果显示不全,请把宽和高加大  字体加大. 首先,用windows画板生成一张1*1白色单色图作为 ...

最新文章

  1. Swift进阶学习笔记
  2. 【转载】 C#使用Math.Abs返回数值的绝对值
  3. 利用序列化与反序列化对Java对象进行深度复制
  4. 洛谷 - P1198 - 最大数 - 线段树
  5. 变种 背包问题_动态规划入门——传说中的零一背包问题
  6. 高端服务器CPU详细图解
  7. Jmeter系列之接口断言
  8. 完全卸载MySQL的方法
  9. 基于Python网络爬虫的设计与实现毕业设计
  10. java cmd 编译jar_Java程序在命令行下编译运行打Jar包
  11. APF有源滤波器仿真,三相三线制 谐波电流检测模块基于p-q方法,ip-iq等方法
  12. 操作系统实验: 进程管理
  13. 收藏 90+深度学习开源数据集整理|包括目标检测、工业缺陷、图像分割等多个方向
  14. 小学生的游戏 FZU - 1575
  15. /Volumes/TeXLive2019/install-tl: No binary platform specified/available, quitting.
  16. 手机剪辑视频指南:去水印、加字幕、做转场,统统一键就搞定
  17. 元宵快乐!!!! 自己做的贺卡。。 :)
  18. AI领域首位图灵奖得主Marvin Minsky:求索“智能”奥秘的一生 | 人物志
  19. DB2数据库如何修改字段名称
  20. 【midomi】Android下最强音乐搜索工具

热门文章

  1. 「网络安全」安全设备篇(5)——UTM
  2. 闪烁着凄烈紫光的太刀。名之为「回光」是因为一度破碎的过去。
  3. 详细篇 (ES6Class类)
  4. NetSuite:一个页面简单功能齐全的软件
  5. apollo6.0发行版安装到启动(内含超多踩坑细节,2022-3-8日亲测可用)
  6. epoll 原理详解
  7. 超频到3200最佳时序_XPG 龙耀 D50 重装铠甲RGB内存 来了超频颗粒、1.95mm加厚散热...
  8. 酒店该如何选择酒店管理软件
  9. 【爬虫进阶】字体解密——案例解析
  10. Dubbo面试问题一:Dubbo是什么?为什么要使用Dubbo?