前言
最近在看别的大佬使用u8g2图形库的代码,看到这一串十六进制数据
PROGMEM const uint8_t main_icon_pic[]{
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xF1, 0x3F,
0xFF, 0xFF, 0xC3, 0x3F, 0xFF, 0xFF, 0x87, 0x3F, 0xFF, 0xFF, 0x07, 0x3F, 0xFF, 0xFF, 0x0F, 0x3E,
0xFF, 0xFF, 0x0F, 0x3E, 0xFF, 0xFF, 0x0F, 0x3C, 0xFF, 0xFF, 0x0F, 0x3C, 0xFF, 0xFF, 0x0F, 0x38,
0xFF, 0xFF, 0x0F, 0x38, 0xFF, 0xFF, 0x0F, 0x38, 0xFF, 0xFF, 0x07, 0x38, 0xFF, 0xFF, 0x07, 0x38,
0xFF, 0xFF, 0x03, 0x38, 0xF7, 0xFF, 0x01, 0x38, 0xE7, 0xFF, 0x00, 0x3C, 0x87, 0x3F, 0x00, 0x3C,
0x0F, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x80, 0x3F,
0x7F, 0x00, 0xC0, 0x3F, 0xFF, 0x01, 0xF0, 0x3F, 0xFF, 0x07, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F}
懵了,这是什么图像。搜下反取模软件,好像没有,PCtoLCD2002只有取模的功能,没有反推图像的功能。好吧,自己写个python程序吧。
正文
PCtoLCD2002设置如图
生成的十六进制数据放入到pyhton文件的data列表里,调好图像的宽高
注意要填好宽高
运行python程序后就能看到图像
代码
Python3及pip、numpy、Matplotlib等模块的安装
import numpy as np
import matplotlib.pyplot as plt
# 输入图像宽高
width = 30 # 宽
height = 30 # 高
# 输入数据
data = [
0x20,0x02,0x00,0x20,0x06,0x00,0x20,0x02,0x00,0x10,0x02,0x00,0x10,0xFF,0x00,0x18,
0x81,0x00,0x98,0x58,0x00,0x54,0x08,0x00,0x12,0x09,0x00,0x10,0x49,0x00,0x10,0x49,
0x00,0x90,0x88,0x00,0x90,0x08,0x01,0x50,0x08,0x01,0x30,0x08,0x00,0x10,0x0E,0x00,
0x10,0x04,0x00,0x00,0x00,0x00]
num_row = height # 行数
num_col = int(width / 8) +1 # 列数
pixels = np.zeros((height, width), dtype=np.uint8) # 空np矩阵,使用uint8类型以保证数值范围在0-255
# 转换为二进制格式的字符串列表并反转每个字符串
binary_strings = ['{:08b}'.format(val)[::-1] for val in data]
# 将二进制字符串拼接成指定数量的一行
rows = [''.join(binary_strings[i:i+num_col])
for i in range(0, len(binary_strings), num_col)]
y = 0
for row in rows:
for i in range(width):
# 要反色、取反显示,就把下面这行代码的0和255互换一下
pixels[y, i] = 255 if row[i] == '1' else 0
y = y+1
# 显示图像
plt.imshow(pixels, cmap='gray', origin='upper',
vmin=0, vmax=255) # 显示范围设置为0-255
plt.axis('off')
plt.show()
实践
看到如下代码,如何反取模
PROGMEM const uint8_t icon_pic[]{0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x0C, 0xCC, 0x3F, 0x7F, 0x00, 0x80, 0x3F,
0x3F, 0x00, 0x00, 0x3F, 0x3F, 0xE0, 0x01, 0x3F, 0x7F, 0xF8, 0x87, 0x3F, 0x7F, 0xFC, 0x8F, 0x3F,
0x3F, 0xFC, 0x0F, 0x3F, 0x0F, 0x3E, 0x1F, 0x3C, 0x0F, 0x1E, 0x1E, 0x3C, 0x0F, 0x1E, 0x1E, 0x3C,
0x0F, 0x3E, 0x1F, 0x3C, 0x3F, 0xFC, 0x0F, 0x3F, 0x7F, 0xFC, 0x8F, 0x3F, 0x7F, 0xF8, 0x87, 0x3F,
0x3F, 0xE0, 0x01, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x80, 0x3F, 0xFF, 0x0C, 0xCC, 0x3F,
0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F}
/* 使用u8g2库绘制位图
u8g2.drawXBMP(x, y, w, h, bitmap);
x,y 是图像左上角的坐标
w,h 是图像的宽和高
bitmap是位图数组*/
u8g2.drawXBMP(10, 12, 30, 30, icon_pic);
这个u8g2.drawXBMP(10, 12, 30, 30, icon_pic)
函数的意思是,在坐标为(10, 12)的位置,绘制宽高30*30的图像,内容为icon_pic
那怎么在python中把这串十六进制数据绘制成图像呢?
上面的代码,把width
填入30,高height
也填入30,十六进制数据填入data
,运行
# 输入图像宽高
width = 30 # 宽
height = 30 # 高
# 输入数据
data = [
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x0C, 0xCC, 0x3F, 0x7F, 0x00, 0x80, 0x3F,
0x3F, 0x00, 0x00, 0x3F, 0x3F, 0xE0, 0x01, 0x3F, 0x7F, 0xF8, 0x87, 0x3F, 0x7F, 0xFC, 0x8F, 0x3F,
0x3F, 0xFC, 0x0F, 0x3F, 0x0F, 0x3E, 0x1F, 0x3C, 0x0F, 0x1E, 0x1E, 0x3C, 0x0F, 0x1E, 0x1E, 0x3C,
0x0F, 0x3E, 0x1F, 0x3C, 0x3F, 0xFC, 0x0F, 0x3F, 0x7F, 0xFC, 0x8F, 0x3F, 0x7F, 0xF8, 0x87, 0x3F,
0x3F, 0xE0, 0x01, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x80, 0x3F, 0xFF, 0x0C, 0xCC, 0x3F,
0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F,
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F]
是一个齿轮的图标!!