最近在玩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=', ')