将简单图像转换为英特尔十六进制

Converting simple image to intel hex

所以我正在为我的微处理器开发一种电子鸡(虚拟宠物)。我将自己的图像制作成 128x64 像素长,因为我使用的是具有该分辨率的显示器,因此每张图像重 1Kbytes。我使用的是 at89s52 (8052) 微控制器,它没有足够的内存来存储我想要的所有动画。我的计划(我有点想保持这种方式)是使用 EPROM 以英特尔十六进制格式保存我的所有图像(我使用的编程器是 SUPERPRO,它会导入该类型的文件)。当然,在 ROM 中有数据之后,汇编代码对我来说会很容易。我不是一个优秀的程序员,无法开发出完全符合我要求的代码(将图像转换为英特尔十六进制),而且我尝试过的所有软件都无法正确生成它们(插入不应该的十六进制值)那里,例如:在空白 space 中应该只有零,并且还有另一个值)。我尝试过使用透明背景、白色背景和 jpg 的 png。我的图片是这样的:

http://imgur.com/a/yiCOb (好像不允许post这里的图片)

我在互联网的其他地方没有看到太多帮助,所以这个问题的答案对未来基于 MCU 的程序员有很大帮助。谢谢。

距离我上次制作 EPROM 大约 30 年了:-)

无论如何,你需要两件事...

第一部分

首先,您的文件是 PNG 格式,这意味着它们有日期、时间、调色板、伽马块和一堆 zlib 压缩数据,您不能只将其复制到屏幕缓冲区。因此,您需要将 PNG 转换为简单的二进制格式,其中 0 关闭,1 开启,文件中没有其他内容。最简单的方法是使用 ImageMagick,它安装在大多数 Linux 平台上,在 macOS 和 Windows 上免费提供。假设您的一个框架称为 anim.png,我们希望将其转换为简单格式,例如 PGM(便携式 GreyMap - 参见 Wikipedia description)我们可以使用 ImageMagick 在控制台像这样:

convert anim.png -compress none anim.pgm

前几行将是:

P2
128 64
255
255 255 255 255 255 255 255 ...
...
...

因为图片是128x64,文件中的最大亮度是255,所以后面的数据都是ASCII(因为我放的是-compress none)。其中,255代表白色,0代表黑色。

由于屏幕太大,这是它的外观图片 - 希望您能看到黑框底部中间的一串零:

现在,如果您再次 运行 相同的命令,但删除 -compress none,将生成相同的 header,但数据将以二进制形式出现。

convert anim.png anim.pgm

而且我们也可以用sed删除header的3行:

convert anim.png anim.pgm | sed '1,3d' > anim.bin

现在你有一个纯像素的二进制文件,没有 dates/times、作者和版权、调色板和压缩数据,你可以传递到下一部分。

第 2 部分

其次,一旦您获得了合理的二进制格式的数据,您需要将其转换为 Intel Hex,为此您需要 srec_cat,每天 Linux 可通过 homebrew Mac.

那么,我没有测试过,也没有使用过,我想你会想要这样的东西:

srec_cat anim.bin -binary -output -intel 

:020000040000FA
:20000000323535203235352032353520323535203235352032353520323535203235352000
:200020003235352032353520323535203235352032353520323535203235352032353520E0
:200040003235352032353520323535203235352032353520323535203235352032353520C0
:200060003235352032353520323535203235352032353520323535203235352032353520A0
:20008000323535203235352032353520323535203235352032353520323535203235352080
...
:207E8000353520323535203235352032353520323535203235352032353520323535203202
:207EA0003535203235352032353520323535203235352032353520323535203235352032E2
:147EC000353520323535203235352032353520323535200A2A
:00000001FF

总结

您可以缩写和简化我上面的建议 - 我会把它留在那里,以便人们将来可以理解它!

convert YourImage.png gray: | srec_cat - -binary -output -intel 

gray: 是一种非常简单的 ImageMagick 格式,相当于没有任何 header 的 PGM 文件的二进制部分。与 PGM 一样,它每个像素使用一个字节,因此对于您的纯黑白需求来说效率会有些低。您可以通过查看文件大小看到这一点 - PGM 文件为 8192 字节,因此每个像素 1 字节。如果你真的非常想要每像素 1 位,你可以使用 PBM 格式,如下所示:

convert YourImage.png pbm: | sed '1,3d' | srec_cat - -binary -output -intel 

注:

  1. 从 ImageMagick v7 开始,您应该将 convert 替换为 magick 以避免与 Windows' built-in convert 将文件系统转换为 NTFS 的命令。

  2. ImageMagick 是一个相当大的包,你可以用 NetPBM 套件同样好地完成它,并且使用名为 pngtopnm 的工具代替 convert.