图像

MicroPython和你一样擅长艺术。如果只有一个5×5的红色LED(设备正面的发光二极管)点阵,你可以通过MicroPython对显示屏做很多控制,从而生成各种有趣的效果。

MicroPython有大量的内置图片可以显示在屏幕上。比如,在显示屏上显示“高兴”,需要输入以下代码:

from microbit import *
display.show(Image.HAPPY)

第一行代码的作用,我觉得你还记得。第二行用 display 对象来 show 一个内置图像. 我们要显示的“高兴”是对象 Image 中称为 HAPPY 的部分。我们通过使用 (())让 show 调用该图像。

../_images/happy.png

下面是一系列内置图像的列表:

  • Image.HEART
  • Image.HEART_SMALL
  • Image.HAPPY
  • Image.SMILE
  • Image.SAD
  • Image.CONFUSED
  • Image.ANGRY
  • Image.ASLEEP
  • Image.SURPRISED
  • Image.SILLY
  • Image.FABULOUS
  • Image.MEH
  • Image.YES
  • Image.NO
  • Image.CLOCK12, Image.CLOCK11, Image.CLOCK10, Image.CLOCK9, Image.CLOCK8, Image.CLOCK7, Image.CLOCK6, Image.CLOCK5, Image.CLOCK4, Image.CLOCK3, Image.CLOCK2, Image.CLOCK1
  • Image.ARROW_N, Image.ARROW_NE, Image.ARROW_E, Image.ARROW_SE, Image.ARROW_S, Image.ARROW_SW, Image.ARROW_W, Image.ARROW_NW
  • Image.TRIANGLE
  • Image.TRIANGLE_LEFT
  • Image.CHESSBOARD
  • Image.DIAMOND
  • Image.DIAMOND_SMALL
  • Image.SQUARE
  • Image.SQUARE_SMALL
  • Image.RABBIT
  • Image.COW
  • Image.MUSIC_CROTCHET
  • Image.MUSIC_QUAVER
  • Image.MUSIC_QUAVERS
  • Image.PITCHFORK
  • Image.XMAS
  • Image.PACMAN
  • Image.TARGET
  • Image.TSHIRT
  • Image.ROLLERSKATE
  • Image.DUCK
  • Image.HOUSE
  • Image.TORTOISE
  • Image.BUTTERFLY
  • Image.STICKFIGURE
  • Image.GHOST
  • Image.SWORD
  • Image.GIRAFFE
  • Image.SKULL
  • Image.UMBRELLA
  • Image.SNAKE

如此多的图像!为何不修改下表示“高兴”的代码,来看一下其他的内置图像在显示器上显示什么呢?只需用上面列表中的任意一个内置图像替换下 Image.HAPPY 就可以了。

创建图像

当然了,你肯定想要micro:bit显示你自己创建的图像,对吗?

这并不难。

物理显示器上的每个LED像素可以设置为十个值的其中一个。如果像素设置为 0 (zero) ,表示处于关闭状态,从字面上理解,即为0亮度。而设置为 9 ,表示亮度最强。 18 代表关闭状态 (0) 和 最强亮度(9)之间的亮度级别.

知道这些后,就可以创建一个新图像了,比如:

from microbit import *

boat = Image("05050:"
             "05050:"
             "05050:"
             "99999:"
             "09990")

display.show(boat)

(运行时,会显示一艘老式的“蓝色彼得”号帆船,这艘船的桅杆亮度比船体还要暗。)

你弄清楚怎么画图了吗?你是否注意到了对物理显示屏显示起作用的每一行数字都在双引号 " 之间并以 : 结尾?每个数字规定一个亮度。 总共有5行,每行有5个数字。所以可以规定物理显示屏上5行中每一行5个像素中每个像素的亮度。这就是创建新图像的方法。

很简单。

实际上,你不用分行写,如果你能跟踪到每一行,则可以重写代码如下:

boat = Image("05050:05050:05050:99999:09990")

动画

静态图像很有趣,但让它们动起来会更加有趣的。用MicroPython实现起来也相当简单,只需一个图像列表就能实现。

下面是一个购物清单:

Eggs
Bacon
Tomatoes

在Python中展示该清单的方法如下:

shopping = ["Eggs", "Bacon", "Tomatoes" ]

我只是创建了一个包含3个数据项,被称为 shopping 的列表。Python 知道这是一个列表是因为该信息在方括号 ([ and ])中。列表中的各项用逗号 (,) 隔开,例子中的数据项是三个字符串: "Eggs", "Bacon""Tomatoes"。我们知道它们是字符串是因为它们是用引号 " 括起来的。

Python可以将任何内容存储在列表中,下面是一个数列:

primes = [2, 3, 5, 7, 11, 13, 17, 19]

注解

数字不需要引号,因为他们代表的是数值,而不是字符串。这就是 2 (数值2)和 "2" (代表数字2的字符/数字)的区别所在。别担心,即使现在弄不明白,很快你就会学会的。

你甚至还可以在同一个列表中存储不同种类的东西:

mixed_up_list = ["hello!", 1.234, Image.HAPPY]

注意到最后一个数据项了吗?一个图像!

我们可以告诉MicroPython动态显示一系列图像。幸运的是,已经有很多的内置图像了。我们称它们为 Image.ALL_CLOCKSImage.ALL_ARROWS:

from microbit import *

display.show(Image.ALL_CLOCKS, loop=True, delay=100)

和显示单张图像一样,我们引用 display.show 在设备显示屏上显示一系列图像。然而,我们告诉MicroPython 使用 Image.ALL_CLOCKS ,MicroPython 将其理解为一个接一个地显示列表中的图像。同时,通过 loop=True ,我们告诉MicroPython循环显示列表中的图像,动画将会永久循环。另外,参数 delay=100 表示我们想要在每个图像之间增加100毫秒(1/10秒)的间隔。

你能想出动态显示 Image.ALL_ARROWS 列表的方法吗?如何避免永久循环?(提示: loop 的默认值是 FalseTrueFalse 会产生相反的效果。)你能改变此动态显示的速度吗?

最后,是创建自己的动画的方法。我举的例子是船沉到了显示器的底部:

from microbit import *

boat1 = Image("05050:"
              "05050:"
              "05050:"
              "99999:"
              "09990")

boat2 = Image("00000:"
              "05050:"
              "05050:"
              "05050:"
              "99999")

boat3 = Image("00000:"
              "00000:"
              "05050:"
              "05050:"
              "05050")

boat4 = Image("00000:"
              "00000:"
              "00000:"
              "05050:"
              "05050")

boat5 = Image("00000:"
              "00000:"
              "00000:"
              "00000:"
              "05050")

boat6 = Image("00000:"
              "00000:"
              "00000:"
              "00000:"
              "00000")

all_boats = [boat1, boat2, boat3, boat4, boat5, boat6]
display.show(all_boats, delay=200)

代码释义:

  • 按照上面描述的方法,我创建了6个 boat 图像。
  • 接着,我将它们放入一个叫 all_boats 的列表。
  • 最后,我要求 display.show 动态显示这个列表,每幅图像之间间隔时间为200毫秒。
  • 由于我未设置 loop=True ,船只会沉一次,所以我的动画从科学角度来说是准确的。

你想显示什么动画呢?你能做动画特效吗?怎样使一个图像有淡入淡出的效果呢?