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

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

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

from PIL import Image, ImageDraw, ImageFont


def 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,白色像素为0
        bitmap.append(row)
    # 将位图数组转换为16进制数组
    hex_array = []
    for y in range(0, height, 8):
        for x in range(width):
            byte = 0
            for bit in range(8):
                if y + bit < height:
                    byte |= (bitmap[y + bit][x] << bit)
            hex_array.append(byte)

    return hex_array


def 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,白色像素为0
        bitmap.append(row)

    # 将位图数组转换为16进制数组
    hex_array = []
    for y in range(0, height, 8):
        for x in range(width):
            byte = 0
            for bit in range(8):
                if y + bit < height:
                    byte |= (bitmap[y + bit][x] << bit)
            hex_array.append(byte)
    return hex_array


if __name__ == '__main__':
    text = 'Hello, 你好'
    font_path = 'NotoSansSC-VariableFont_wght.ttf'
    font_size = 16
    width = 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=', ')
        
要在STM32上的OLED屏幕上显示图片,你可以按照以下步骤进行操作: 1. 准备图片:将你想要显示的图片转换为适合OLED屏幕的格式,通常为位图格式(BMP)或无压缩的位图(RAW)格式。确保图片的分辨率与OLED屏幕的分辨率匹配。 2. 引入库文件:在你的STM32项目中引入相应的OLED屏幕驱动库文件,例如SSD1306驱动库。 3. 初始化OLED屏幕:使用驱动库提的函数初始化OLED屏幕。这通常包括设置通信接口(如I2C或SPI)和发送初始化命令。 4. 显示图片:将转换后的图片数据通过驱动库提的函数发送到OLED屏幕。这通常涉及到设置显示区域和发送像素数据。 以下是一个示例代码片段,演示了如何使用SSD1306驱动库在STM32上显示图片(假设使用I2C通信接口): ```c #include "ssd1306.h" // 定义图片数据数组 const uint8_t image_data[] = { // 图片数据 }; // 初始化OLED屏幕 void OLED_Init() { // 初始化I2C通信接口 // ... // 发送初始化命令到OLED屏幕 ssd1306_Init(); } // 显示图片 void OLED_ShowImage() { // 设置显示区域和坐标 ssd1306_SetColumnAddress(0, OLED_WIDTH - 1); ssd1306_SetPageAddress(0, OLED_HEIGHT / 8 - 1); // 发送图片数据到OLED屏幕 ssd1306_DrawBitmap(image_data, OLED_WIDTH, OLED_HEIGHT); } int main() { // 初始化OLED屏幕 OLED_Init(); // 显示图片 OLED_ShowImage(); while (1) { // 主循环 } } ``` 请注意,上述示例代码仅作为参考,具体的实现可能因使用的OLED屏幕驱动库和硬件配置而有所不同。你需要根据你使用的具体驱动库和硬件进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值