2023-1-13 15:30:02 [显示全部楼层]
1400浏览
查看: 1400|回复: 2

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

[复制链接]
本帖最后由 Forgotten 于 2023-9-14 13:23 编辑

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

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

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


代码:
  1. #  -*- coding: UTF-8 -*-
  2. from PIL import Image,ImageDraw,ImageFont
  3. #用PIL库绘图
  4. img = Image.new('RGB', (240, 320), (248, 173, 48)) #创建空白图片
  5. imgdraw = ImageDraw.ImageDraw(img)#创建一个绘图对象,传入img表示对img进行绘图操作
  6. font = ImageFont.truetype(font="HYQiHei_50S.ttf",size=22)#使用什么字体和什么大小,将字体文件放到级目录
  7. imgdraw.text(xy=(10,10),text='dice你好',fill='red',font=font)#调用绘图对象中的text方法表示写入文字
  8. img=img.transpose(Image.FLIP_LEFT_RIGHT)#左右翻转
  9. img=img.transpose(Image.FLIP_TOP_BOTTOM)#上下翻转
  10. #用unihiker库把图片显示到行空板屏幕上
  11. from unihiker import GUI  
  12. gui=GUI()  
  13. gui.draw_image(x=0, y=0, image= img)
  14. import time
  15. while True:
  16.     #增加等待,防止程序退出和卡住
  17.     time.sleep(1)
复制代码


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


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

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


显示效果如下:

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

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

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

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

  1. from PIL import Image, ImageDraw, ImageFont
  2. #输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
  3. def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
  4.   # 创建字体
  5.   font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
  6.   # 获取文字的宽度和高度
  7.   width, height = font.getsize(text)
  8.   # 创建空白图片
  9.   img = Image.new('RGB', (width, height), background_color)
  10.   # 创建绘图对象
  11.   imgdraw = ImageDraw.ImageDraw(img)
  12.   # 绘制文字
  13.   imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
  14.   if rotate:
  15.     # 旋转图片
  16.     img = img.rotate(90, expand=True)
  17.   return img
复制代码


横屏坐标转换
将行空板横置的时候,如果以左上角为原点,则我们希望用如下这样的坐标来显示,但是实际上unihiker库中x和y是以竖屏左上角为原点,因此对x和y坐标需要转换
[Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库图4
如下图,希望输入x=0,y=0的时候文字显示在屏幕左上角(横屏时候),此时实际上需要传入的坐标应该是x=0,y=320
因此:
实际传入的坐标x=希望输入的坐标y
实际传入的坐标y=320-希望输入的坐标x
[Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库图5

另外图片的对齐方式应该改为origin = "bottom_right"
[Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库图6


案例一:完整代码如下:

  1. from PIL import Image, ImageDraw, ImageFont
  2. #输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
  3. def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
  4.   # 创建字体
  5.   font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
  6.   # 获取文字的宽度和高度
  7.   width, height = font.getsize(text)
  8.   # 创建空白图片
  9.   img = Image.new('RGB', (width, height), background_color)
  10.   # 创建绘图对象
  11.   imgdraw = ImageDraw.ImageDraw(img)
  12.   # 绘制文字
  13.   imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
  14.   if rotate:
  15.     # 旋转图片
  16.     img = img.rotate(90, expand=True)
  17.   return img
  18. # 使用unihiker库将图片显示到行空板屏幕上
  19. from unihiker import GUI
  20. gui = GUI()
  21. #将文字1转换为横屏的图片
  22. img = text_to_image(text='Hello, World!', color="#FF0000", font_size=25)
  23. #坐标转换
  24. x=10
  25. y=100
  26. x_c=y
  27. y_c=320-x
  28. #将图片显示到屏幕
  29. gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img)
  30. #将文字2转换为横屏的图片
  31. img2 = text_to_image(text='你好呀!', color="#00FF00", font_size=22)
  32. #坐标转换
  33. x=10
  34. y=130
  35. x_c=y
  36. y_c=320-x
  37. #将图片显示到屏幕
  38. gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img2)
  39. import time
  40. while True:
  41.   # 增加等待,防止程序退出和卡住
  42.   time.sleep(1)
复制代码
[Python]如何在行空板上显示颠倒镜像文字?横屏显示,PIL库图8


案例二:横屏显示麦克风音量:
  1. from PIL import Image, ImageDraw, ImageFont
  2. #输入参数:文字内容,文字颜色,文字字号,背景颜色,是否旋转(默认旋转)
  3. def text_to_image(text, color, font_size=22, background_color="#FFFFFF", rotate=True):
  4.   # 创建字体
  5.   font = ImageFont.truetype(font="HYQiHei_50S.ttf", size=font_size)
  6.   # 获取文字的宽度和高度
  7.   width, height = font.getsize(text)
  8.   # 创建空白图片
  9.   img = Image.new('RGB', (width, height), background_color)
  10.   # 创建绘图对象
  11.   imgdraw = ImageDraw.ImageDraw(img)
  12.   # 绘制文字
  13.   imgdraw.text(xy=(0, 0), text=text, fill=color, font=font)
  14.   if rotate:
  15.   # 旋转图片
  16.     img = img.rotate(90, expand=True)
  17.   return img
  18. # 使用unihiker库将图片显示到行空板屏幕上
  19. from unihiker import GUI
  20. from unihiker import Audio
  21. gui = GUI()
  22. audio = Audio()
  23. #显示在横屏状态下10,100位置
  24. x=10
  25. y=100
  26. x_c=y
  27. y_c=320-x
  28. #文字转图片
  29. img = text_to_image(text="sound val", color="#FF0000", font_size=25)
  30. #将图片显示到屏幕
  31. sound_text = gui.draw_image(x=x_c, y=y_c, origin = "bottom_right",image=img)
  32. import time
  33. while True:
  34.   sound_val = audio.sound_level()
  35.   img = text_to_image(text="麦克风音量:"+str(sound_val), color="#FF0000", font_size=25)
  36.   sound_text.config(image=img)
  37.   time.sleep(0.1)
复制代码



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

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

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

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


完。





王奕翔  见习技师

发表于 2023-1-13 18:50:39

厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-1-14 08:50:18

厉害厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail