1. 文档中心
  2. 比卜创造 Micro:bit
  3. Python
  4. 图像

图像

BiBoPython 在「艺术」方面能做的事,大概就相当于:你只有一块 5×5 的红色 LED 点阵(LED 即发光二极管——就是 micro:bit 正面会亮的小灯),但你可以对这块屏幕做相当精细的控制,做出各种有趣效果。

BiBoPython 自带许多内置图案,可以直接显示。例如让 micro:bit 看起来「开心」:

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

第一行你应该已经熟悉了。第二行用 display 对象的 show 方法显示一张内置图像。我们要显示的开心脸属于 Image 对象,名叫 HAPPY。把它写在 show 的圆括号里即可。

开心脸图案
开心脸图案

内置图像一览

  • 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.SCISSORS

种类不少!不妨把上面显示 Image.HAPPY 的代码改成列表里的其他内置图像,看看效果。

自制图像

当然,你也想画自己的图案,对吧?这很简单。

物理显示屏上每个 LED 像素可以设为 0 到 9 共十个亮度值。设为 0 表示熄灭(零亮度);设为 9 表示最亮;1 到 8 则是介于熄灭与最亮之间的各级亮度。

知道这些,就可以创建新图像:

from bibo import *

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

display.show(boat)

运行后,你会看到一艘老式帆船——桅杆比船身暗一些。

看出怎么「画图」了吗?显示屏的每一行对应一行以 : 结尾、写在双引号 " 里的数字;每个数字表示一个像素的亮度。五行、每行五个数,就能分别指定每个 LED 的亮度——这就是自制图像的方法。简单!

其实不必拆成多行写。若你能记清每行,也可以写成:

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

动画

静态图已经很好玩,动起来更有趣。在 BiBoPython 里这同样简单——只要用图像列表!

购物列表示例:

  • 鸡蛋
  • 培根
  • 番茄

在 Python 里可以写成:

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

我们创建了名为 shopping 的列表,包含三项。Python 知道这是列表,因为用了方括号 [ 和 ];项与项之间用逗号 , 分隔。这里三项都是字符串:"Eggs"、"Bacon"、"Tomatoes"(字符串用双引号包住)。

列表里可以存各种类型。例如数字列表:

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

甚至可以在同一个列表里放不同类型:

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

最后一项是图像!

我们可以让 BiBoPython 播放图像列表动画。内置了两组图像列表:Image.ALL_CLOCKS 和 Image.ALL_ARROWS:

from bibo import *

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

和单张图像一样,用 display.show 显示。这里传入 Image.ALL_CLOCKS,BiBoPython 会依次显示列表中的每一张图。loop=True 表示循环播放;delay=100 表示每张图之间间隔 100 毫秒(十分之一秒)。

你能用 Image.ALL_ARROWS 做动画吗?怎样让它只播一遍而不无限循环?(提示:True 的反面是 False;loop 默认是 False。)能否改变动画速度?

最后,自制动画示例——让帆船沉入屏幕底部:

from bibo 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)

代码思路:

  • 用前面相同的方式创建六张 boat 图像。
  • 把它们放进列表 all_boats。
  • 调用 display.show 播放动画,间隔 200 毫秒。
  • 没有设置 loop=True,所以船只会沉一次——从科学角度说,这很合理。:-)

你想动画什么?能做渐隐再渐亮的效果吗?试试看!