Python转换图片为BITMAP供OLED屏幕显示

最近在玩ESP32,外接了一个0.96寸的oled屏幕,不想找取模软件了,直接gpt生成代码,小改一下直接用了。

字体下载地址:https://fonts.google.com/selection?query=Noto+Sans

from PIL import Image, ImageDraw, ImageFontdef image_to_hex_array(image_path, width, height):# 打开图像文件img = Image.open(image_path)# 将图像调整为指定的宽度和高度img = img.resize((width, height), Image.ANTIALIAS)# 将图像转换为1位像素的黑白图像img = img.convert('1')# 获取图像的像素数据pixel_data = list(img.getdata())# 转换像素数据为位图数组bitmap = []for y in range(height):row = []for x in range(width):pixel = pixel_data[y * width + x]row.append(1 if pixel == 0 else 0)  # 黑色像素为1,白色像素为0bitmap.append(row)# 将位图数组转换为16进制数组hex_array = []for y in range(0, height, 8):for x in range(width):byte = 0for bit in range(8):if y + bit < height:byte |= (bitmap[y + bit][x] << bit)hex_array.append(byte)return hex_arraydef text_to_hex_array(text, font_path, font_size, width, height):# 创建空白图像img = Image.new('1', (width, height), 1)  # 白色背景draw = ImageDraw.Draw(img)# 加载字体font = ImageFont.truetype(font_path, font_size)# 在图像上绘制文本draw.text((0, 0), text, font=font, fill=0)  # 黑色文本# 获取图像的像素数据pixel_data = list(img.getdata())# 转换像素数据为位图数组bitmap = []for y in range(height):row = []for x in range(width):pixel = pixel_data[y * width + x]row.append(1 if pixel == 0 else 0)  # 黑色像素为1,白色像素为0bitmap.append(row)# 将位图数组转换为16进制数组hex_array = []for y in range(0, height, 8):for x in range(width):byte = 0for bit in range(8):if y + bit < height:byte |= (bitmap[y + bit][x] << bit)hex_array.append(byte)return hex_arrayif __name__ == '__main__':text = 'Hello, 你好'font_path = 'NotoSansSC-VariableFont_wght.ttf'font_size = 16width = 128  # OLED屏幕宽度height = 64  # OLED屏幕高度hex_array = text_to_hex_array(text, font_path, font_size, width, height)# 打印16进制数组for byte in hex_array:print(f'0x{byte:02X}', end=', ')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防止多次点击,vue的按钮上做简易的防抖节流处理

话不多说,上个视频,看看是不是你要的效果 防抖节流 1.创建一个directive.js // directive.js export default {install(Vue) {// 防重复点击(指令实现)Vue.directive(repeatClick, {inserted(el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabl…

Leetcode 450:删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…

6月29日,每日信息差

第一、位于四川省绵阳市的中广核质子治疗装备制造基地正式通过竣工验收&#xff0c;为全球装机数量和治疗患者数量最多的国际领先质子治疗系统全面国产化奠定了坚实基础。质子治疗作为目前全球最尖端的肿瘤放射治疗技术之一&#xff0c;与传统放疗技术相比&#xff0c;质子治疗…

C#微信预约挂号系统全套源码,适用于各级公立和民营医院,与院内his、lis、pacs系统对接。

C#微信预约挂号系统源码&#xff0c;团队自主研发&#xff0c;三甲医院应用多年&#xff0c;系统稳定&#xff0c;功能齐全&#xff0c;支持二次开发&#xff0c;项目使用。 微信预约挂号系统可以让患者足不出户就可以利用微信进行在线挂号&#xff0c;实现分时段就诊&#xff…

安装llama_factory

第一版&#xff1a; nvidia-smigit clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml pip install --upgrade huggingface_hub llamafactory-cli webui llamafactory-cli webui -…

【LLM 评估】GLUE benchmark:NLU 的多任务 benchmark

论文&#xff1a;GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding ⭐⭐⭐⭐ arXiv:1804.07461, ICLR 2019 Site: https://gluebenchmark.com/ 文章目录 一、论文速读二、GLUE 任务列表2.1 CoLA&#xff08;Corpus of Linguistic Accep…

java输出小写的a-z以及大写的Z-A

如果是C语言&#xff0c;可以直接使用格式化输出中的%c 但是Java没有&#xff0c;所以可以1、强制类型转化&#xff1b;2、for循环递增变量中直接定义为char类型 方法一&#xff1a;强制类型转化 //2024.06.29 public class Homework07{public static void main(String[] arg…

卷积、池化小记

卷积和池化是深度学习中&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中非常重要的两个概念。下面我将分别详细解释卷积和池化的定义、作用以及常见的类型。 卷积&#xff08;Convolution&#xff09; 1. 定义 卷积是通过两个函数f和g生成第三个函数的一种数…

在晋升受阻或遭受不公待遇申诉时,这样写是不是好一些?

在晋升受阻或遭受不公待遇申诉时&#xff0c;这样写是不是好一些&#xff1f; 在职场中&#xff0c;晋升受阻或遭受不公待遇是员工可能面临的问题之一。面对这样的情况&#xff0c;如何撰写一份有效的申诉材料&#xff0c;以维护自己的合法权益&#xff0c;就显得尤为重要。#李…

STM32CUBEMX配置USB虚拟串口

STM32CUBEMX配置USB虚拟串口 cubemx上默认配置即可。 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 配置完后生成工程&#xff0c;主要就是要知道串口的收发接口就行了。 发送&#xff1a;CDC_Transmit_FS()&#xff0c;同时记得包含头文件#include “…

RStudio学习笔记(二):向量

在R语言中&#xff0c;向量类似于数学上的集合概念&#xff0c;由一个或多个元素构成。指用于存储数值型、字符型、逻辑型数据的一维数组。 1、向量的创建 # R语言中向量的创建可以通过函数c()x <- c(1,2,3,4,5) # 存储数值型y <- c("one","two&q…

shopify入门教程-应用开发(二)

4.内网穿透 为什么要用这个&#xff0c;就是把电脑上的开发内容通过内网穿透显示到你的开发店铺上。这里的内网穿透我用了ngrok,花生壳&#xff0c;但都不如shopify官方推荐的cloudflare好用。所以这里我也推荐cloudflare。 运用内网穿透2个步骤 把app运行起来 ​​​​​​​…

YOLO网络结构特点收录

YOLO网络结构特点收录 YOLO&#xff08;You Only Look Once&#xff09;网络结构随着版本迭代不断进化&#xff0c;以下是一些关键版本的网络结构特点概述&#xff1a; YOLOv1 输入&#xff1a;将图像调整至固定尺寸&#xff0c;如448x448像素。骨干网络&#xff1a;初期版本…

java TCP服务器与客户端通信示例

目录 背景: TCP服务代码解析: TCP服务器的代码: 服务器程序的工作流程: TCP客户端代码解析 : TCP客户端代码: 客户端工作流程: 总结: 背景: 如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP&#xff08;Transmission Control Protocol&…

RocketMQ源码学习笔记:Broker接受消息和发送消息

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、技术亮点2.1、消息写入时的自旋锁和可重入锁2.2、堆外内存机制2.2.1、Overview2.2.2、源码2.2.2.1、开启堆外内存的条件2.2.2.2、堆外内存的初始化2.2.2.3、写消息到堆外内存2…

MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载

MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片&#xff0c;简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程&#xff0c;也就是MAS0902量产过程&#xff1a; 注意&#xff1a;开卡转接线必须要用ASM1153E或JMS578主控…

(1)std::trhead的回调,中频繁发送信号,会导致qt的事件循环处理不过来吗

在Qt中,事件循环是负责处理所有事件和信号的核心机制。事件循环会不断地检查是否有待处理的事件,并且调度相应的事件处理器。在标准模板库(STL)的std::thread中使用回调函数来频繁发送信号到Qt的事件循环中,确实可能会导致性能问题,尤其是在高频率信号发送的情况下。 当…

鉴权开发框架Django REST framework的应用场景

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

24级中国科学技术大学843信号与系统考研分数线,中科大843初复试科目,参考书,大纲,真题,苏医工生医电子信息与通信工程。

(上岸难度&#xff1a;★★★★☆&#xff0c;考试大纲、真题、经验帖等考研资讯和资源加群960507167/博睿泽电子信息通信考研咨询&#xff1a;34342183) 一、专业目录及考情分析 说明: ①复试成绩:满分100分。上机满分50分&#xff0c;面试满分150分&#xff0c;复试成绩(上机…

ros1仿真导航机器人 基础传感器数据读取

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 仿真环境 gazebo、rviz、ros1 2 机器人模型 <?xml version"1.0"?> <robot name"wpb_home_gazebo"><link name"base_footprint"><visual><origin …