Forgotten 发表于 2023-1-13 15:30:02

[Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库

本帖最后由 Forgotten 于 2023-9-14 13:23 编辑

问题:来自QQ群的问题:如何在屏幕上显示文字,上下颠倒,左右镜像?



解决思路:
- 行空板专用的unihiker库(基于tkinter)没有提供文字这种非正常显示效果,好在行空板支持万能的Python,因此考虑使用其他Python库。
- 从功能上来说是需要上下左右颠倒,因此图片库一般都有这种功能,只需要找一个可以显示文字的图片库即可,那么最常用的就是PIL库了,搜索一番得到如下代码


代码:
#-*- coding: UTF-8 -*-

from PIL import Image,ImageDraw,ImageFont
#用PIL库绘图
img = Image.new('RGB', (240, 320), (248, 173, 48)) #创建空白图片
imgdraw = ImageDraw.ImageDraw(img)#创建一个绘图对象,传入img表示对img进行绘图操作

font = ImageFont.truetype(font="HYQiHei_50S.ttf",size=22)#使用什么字体和什么大小,将字体文件放到级目录
imgdraw.text(xy=(10,10),text='dice你好',fill='red',font=font)#调用绘图对象中的text方法表示写入文字


img=img.transpose(Image.FLIP_LEFT_RIGHT)#左右翻转
img=img.transpose(Image.FLIP_TOP_BOTTOM)#上下翻转

#用unihiker库把图片显示到行空板屏幕上
from unihiker import GUI
gui=GUI()

gui.draw_image(x=0, y=0, image= img)

import time
while True:
    #增加等待,防止程序退出和卡住
    time.sleep(1)

说明 :
先使用PIL库创建一个空白图片,然后在图片上面显示文字,然后对图片进行翻转,最后为了在行空板上显示,用unihiker库的draw_image函数将PIL库产生的图片显示到屏幕上。
注:其中HYQiHei_50S.ttf是字体文件,放到程序同级目录下,可以在行空板群文件搜索下载,网上找其他字体文件也可以。


效果图:


文字横屏显示
在前面思路的基础上,还可以扩展一个常见的应用场景,就是需要行空板横屏显示文字。


显示效果如下:



将文字转换为旋转90度后的图片的方法:

创建一个跟文字宽高相同的PIL图片画布,然后将文字显示上去,再把图片旋转90度,就得到了一个横着显示的文字了。

可以将此功能封装成了一个函数方便使用:

from PIL import Image, ImageDraw, ImageFont

#输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
# 创建字体
font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
# 获取文字的宽度和高度
width, height = font.getsize(text)
# 创建空白图片
img = Image.new('RGB', (width, height), background_color)
# 创建绘图对象
imgdraw = ImageDraw.ImageDraw(img)
# 绘制文字
imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
if rotate:
    # 旋转图片
    img = img.rotate(90, expand=True)
return img


横屏坐标转换
将行空板横置的时候,如果以左上角为原点,则我们希望用如下这样的坐标来显示,但是实际上unihiker库中x和y是以竖屏左上角为原点,因此对x和y坐标需要转换

如下图,希望输入x=0,y=0的时候文字显示在屏幕左上角(横屏时候),此时实际上需要传入的坐标应该是x=0,y=320
因此:
实际传入的坐标x=希望输入的坐标y
实际传入的坐标y=320-希望输入的坐标x


另外图片的对齐方式应该改为origin = "bottom_right"



案例一:完整代码如下:

from PIL import Image, ImageDraw, ImageFont

#输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
# 创建字体
font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
# 获取文字的宽度和高度
width, height = font.getsize(text)
# 创建空白图片
img = Image.new('RGB', (width, height), background_color)
# 创建绘图对象
imgdraw = ImageDraw.ImageDraw(img)
# 绘制文字
imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
if rotate:
    # 旋转图片
    img = img.rotate(90, expand=True)
return img


# 使用unihiker库将图片显示到行空板屏幕上
from unihiker import GUI
gui = GUI()

#将文字1转换为横屏的图片
img = text_to_image(text='Hello, World!', color="#FF0000", font_size=25)

#坐标转换
x=10
y=100
x_c=y
y_c=320-x
#将图片显示到屏幕
gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img)

#将文字2转换为横屏的图片
img2 = text_to_image(text='你好呀!', color="#00FF00", font_size=22)
#坐标转换
x=10
y=130
x_c=y
y_c=320-x
#将图片显示到屏幕
gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img2)

import time

while True:
# 增加等待,防止程序退出和卡住
time.sleep(1)


案例二:横屏显示麦克风音量:
from PIL import Image, ImageDraw, ImageFont

#输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
# 创建字体
font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
# 获取文字的宽度和高度
width, height = font.getsize(text)
# 创建空白图片
img = Image.new('RGB', (width, height), background_color)
# 创建绘图对象
imgdraw = ImageDraw.ImageDraw(img)
# 绘制文字
imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
if rotate:
# 旋转图片
    img = img.rotate(90, expand=True)
return img


# 使用unihiker库将图片显示到行空板屏幕上
from unihiker import GUI
from unihiker import Audio

gui = GUI()
audio = Audio()

#显示在横屏状态下10,100位置
x=10
y=100
x_c=y
y_c=320-x
#文字转图片
img = text_to_image(text="sound val", color="#FF0000", font_size=25)
#将图片显示到屏幕
sound_text = gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img)


import time

while True:
sound_val = audio.sound_level()
img = text_to_image(text="麦克风音量:"+str(sound_val), color="#FF0000", font_size=25)
sound_text.config(image=img)
time.sleep(0.1)




使用UNIHIKER库
如果使用unihiker库显示横屏文字则更简单,在文字显示draw_text函数中有一个angle参数,可以设置文字旋转角度:






完。





王奕翔 发表于 2023-1-13 18:50:39

厉害

花生编程 发表于 2023-1-14 08:50:18

厉害厉害

贞雍 发表于 2025-2-1 14:22:39

问一下版主,行空板M10的python版本是3.7.3,最近调用智谱清言和讯飞语音api做一个人工智能问答器,提示行空板缺乏zhipuai库,安装了库以后,又提示缺乏typing库,安装typing库时出错,提示要在虚拟环境安装,否则容易导致内部错误,安装了虚拟环境以后再安装typing时,行空板又提示默认的python是3.7,不支持typing,而解决方案是可以安装兼容版本typing-extensions,安装了typing-extensions以后,还是不能正常运行。想问一下,能不能将行空板的python版本升级到3.8,怎么升级?是否影响原系统依赖?安装后系统环境怎么修改为python3.8?谢谢!

Forgotten 发表于 2025-2-21 19:55:54

贞雍 发表于 2025-2-1 14:22
问一下版主,行空板M10的python版本是3.7.3,最近调用智谱清言和讯飞语音api做一个人工智能问答器,提示行 ...

这个仓库的release中有编译过的python3.8.5的包,可以按照readme安装一个单独的3.8.5的包,安装之后就可以使用Python3.8的命令了。

https://github.com/liliang9693/unihiker-python-makefiles

内置的3.7的包是debian10系统默认的,最好不要修改,可能会有其他问题。
页: [1]
查看完整版本: [Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库