# bmp2lcd **Repository Path**: HuacongHe/bmp2lcd ## Basic Information - **Project Name**: bmp2lcd - **Description**: bmp图片批量转c数组小程序 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-06-22 - **Last Updated**: 2026-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](bmp图片批量转c数组小程序【工具篇】) # 1、前言 --------**要想做好嵌入式软件开发,好的软件工具少不了,能很好地提高软件开发效率。**------- 最近在做包含黑白lcd显示屏的项目,有不少的界面需要生成。我们经常会把lcd的界面转成数组,再放到代码里面调用显示。我们比较常用的bmp转数组软件是imglcd这个软件。 这个软件下载链接可以参考我上一篇文章:[【一、嵌入式软件开发常用软件附下载链接】](https://blog.csdn.net/hehuacong/article/details/139577053?spm=1001.2014.3001.5501) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d2292ee5646948d099665769f7068276.png#pic_center) 这个软件非常好用,基本做嵌入式界面开发的都会用到。**但是有个问题,如果我们的界面很多的时候怎么办呢,要处理的照片几十上百张的时候,有时候还有需要对生成的数组做一些格式化的需求,这个软件有不行了**。因为img2lcd不能对图片做批量操作,生成的数组文件也不能加一些定制化的内容,那么我们的工作量会很大,**甚至还会遇到项目组改需求改界面的情况**,那是不是又得重新手动生成数组了,很多时间都花在了无用功上面。所以,自己写一些自动化程序做这些没脑子内容很有必要,**可以很大提高我们的工作效率**。我下面用python做了一个小程序,供大家参考。 # 2、手写bmp图片批量转c数组小程序 ## 2.1 下载链接 ## 2.2 效果图 效果图: 操作简单:手动输入文件夹路径或者单击搜索按钮选择文件夹路径,点击批量生成就ok了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/329b1b164adb44968a63ee32d9651061.png#pic_center) 生成的c语言数组如下: 所有该路径下的bmp图片的数组都生成再bmp_to_arr.c文件下。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/87e7b0f02eab429ab73ac3a3cea38ffe.png#pic_center) ## 2.3 代码 直接上代码: app界面如下: 代码简单易懂,不会python的看文件名都能看懂,可以根据需要修改。 ```c import tkinter as tk from tkinter import filedialog from bmp2array import bmp_process version = 'v1.0' def open_file_dialog(): # 使用filedialog.askopenfilename打开文件选择对话框 file_path = filedialog.askdirectory() if file_path: # 将选择的文件路径设置到输入框中 entry.delete(0, tk.END) # 清空输入框 entry.insert(0, file_path) # 插入新的文件路径 def process_file_path(): # 获取输入框中的文件路径 file_path = entry.get() if file_path: # 在这里处理文件路径,例如打印出来 print("Processing file:", file_path) bmp_process(file_path) else: print("Please enter a file path.") # 创建主窗口 root = tk.Tk() root.title(f'bmp转数组 {version}') # 设置窗口大小 root.geometry("300x120") # 创建一个标签提示用户输入文件路径 label = tk.Label(root, text="输入路径或者点击搜索按钮") label.pack() # 创建一个输入框用于输入文件路径 entry = tk.Entry(root) entry.pack() # 创建一个按钮用于打开文件选择对话框 button_browse = tk.Button(root, text="搜索", command=open_file_dialog) button_browse.pack() # 创建一个按钮用于处理文件路径 button_process = tk.Button(root, text="批量生成", command=process_file_path) button_process.pack() # 运行主循环 root.mainloop() ``` bmp图片转c语言数组。目前只是支持黑白图片转数组 ```c import os from PIL import Image store_file_c = 'bmp_to_arr.c' store_file_h = 'bmp_to_arr.c' def format_hex(num): # 确保num是0-255之间的整数 num = num & 0xFF # 使用字符串格式化,':02x'表示至少两位,不足两位前面补零,并且是十六进制小写 hex_str = format(num, '02x') # 添加'0x'前缀 return '0x' + hex_str def open_bmp_and_check(file_path): try: # 尝试打开图片 img = Image.open(file_path) # 检查图片是否打开成功(通常如果文件损坏或路径错误,Image.open会抛出异常) img.verify() # 验证图片文件是否损坏 print(f"图片 {file_path} 正常打开") # 如果需要,可以在这里对图片进行进一步处理 # ... except Exception as e: print(f"打开图片 {file_path} 时出错: {e}") return False finally: # 注意:通常不需要显式关闭由Pillow打开的图像文件 # 因为Pillow会管理自己的资源,但如果你需要确保资源被释放,可以调用 img.close() # img.close() pass return True #将黑白bmp图片转数组 def trans_ont_bit_bmp_to_ascii(filename): if open_bmp_and_check(filename): # print("处理图片...") pass else: # print("无法处理图片") return # 尝试打开图片 img = Image.open(filename) # 打印基本信息 # print(f"Filename: {filename}") # print(f"Format: {img.format}") # print(f"Size: {img.size}") # print(f"Mode: {img.mode}") # 将图像转换为灰度模式(如果需要) if img.mode != "L": img = img.convert("L") cnt = 0 num = 0 byte_cnt = 0 ascii_art = '' arr_name = '' bmp_data = '' for y in range(img.height): for x in range(img.width): # 获取像素值(在0-255之间) pixel_value = img.getpixel((x, y)) # if pixel_value == 0x00: # bmp_data += '#' # else: # bmp_data += '*' # 阴码 低位在前 逐行扫描 if pixel_value == 0x00: # bmp_data += ' ' num |= 0x01 << cnt # num |= 0x80 >> cnt else: # bmp_data += '*' num &= ~(0x01 << cnt) # num &= ~(0x80 >> cnt) cnt += 1 if cnt < 8: pass else : cnt = 0 bmp_data += format_hex(num) byte_cnt += 1 bmp_data += ',' num = 0 if (byte_cnt % 16) == 0: bmp_data += "\n" if (cnt != 0):#满一行从头开始 cnt = 0 #最后一行不够8bit,用一个字节表示 bmp_data += format_hex(num) byte_cnt += 1 num = 0 bmp_data += ',' if (byte_cnt % 16) == 0: bmp_data += "\n" # ascii_art += "\n" # 换行 #bmp格式化内容 file_name = os.path.basename(filename) arr_name, file_externtion= os.path.splitext(file_name) ascii_art += '\n' ascii_art += 'static const uint8_t ' #文件名做数组名 ascii_art += arr_name ascii_art_size = str(byte_cnt) #数组大小 ascii_art += f"[{ascii_art_size}] = " ascii_art += "\n{" ascii_art += f"/*{str(img.width)}*{str(img.height)}*/\n" ascii_art += bmp_data ascii_art += '\n};\n' # print("\nASCII Art:", byte_cnt, img.height * img.width) # print(ascii_art) return ascii_art def bmp_process(directory): store_file_dir = directory + '\\' + store_file_c f_c = open(store_file_dir, 'w') print(store_file_dir) # 遍历目录中的所有文件和子目录 for root, dirs, files in os.walk(directory): for file in files: # 检查文件是否以.bmp结尾 if file.lower().endswith('.bmp'): # 构建文件的完整路径 file_path = os.path.join(root, file) content = trans_ont_bit_bmp_to_ascii(file_path) f_c.write(content) def main(): bmp_process('C:\\Users\\admin\\Desktop\\img') # ---------------- 程序入口 ---------------- if (__name__ == "__main__"): main() ``` ## 2.4 将python文件打包成exe文件 要将Python脚本打包成`.exe`文件,你可以使用各种第三方工具,其中最常见的可能是`PyInstaller`。以下是使用`PyInstaller`的基本步骤: 1. **安装PyInstaller** 首先,你需要确保你的Python环境已经安装好了。然后,你可以使用pip来安装PyInstaller: ```bash pip install pyinstaller ``` 或者,如果你使用的是conda作为Python包管理器,你可以使用: ```bash conda install -c conda-forge pyinstaller ``` 2. **打包Python脚本为.exe** 安装好PyInstaller后,你可以使用以下命令来打包你的Python脚本(例如`your_script.py`): 该命令生成的exe会有弹出调试窗口 ```bash pyinstaller --onefile your_script.py ``` 这里的`--onefile`选项是可选的,它告诉PyInstaller将所有的文件打包到一个单独的`.exe`文件中。如果你不使用这个选项,PyInstaller会创建一个包含多个文件和目录的文件夹。 不需要调试窗口的可以用一下命令: ```bash pyinstaller --onefile --windowed your_script.py ``` 3. **找到生成的.exe文件** 打包完成后,你会在`dist/`目录下找到一个名为`your_script.exe`的文件(如果你使用了`--onefile`选项)。 注意: * PyInstaller可能无法处理所有的Python库或功能。如果你的脚本依赖于某些特殊的库或功能,并且PyInstaller无法正确处理它们,你可能需要查找额外的步骤或替代方案。 * 在某些情况下,你可能需要指定Python解释器的路径或其他选项。你可以通过运行`pyinstaller --help`来查看所有可用的选项和参数。 * PyInstaller打包的`.exe`文件可能会比较大,因为它包含了你的脚本所依赖的所有Python库和解释器。如果你正在寻找一个更小的解决方案,你可能需要考虑使用其他工具或方法,如Cython或Py2exe(但请注意,这些工具也有其自己的限制和兼容性问题)。