本帖最后由 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参数,可以设置文字旋转角度:
完。
|