将简单图像转换为英特尔十六进制
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
注:
从 ImageMagick v7 开始,您应该将 convert
替换为 magick
以避免与 Windows' built-in convert
将文件系统转换为 NTFS 的命令。
ImageMagick 是一个相当大的包,你可以用 NetPBM 套件同样好地完成它,并且使用名为 pngtopnm
的工具代替 convert
.
所以我正在为我的微处理器开发一种电子鸡(虚拟宠物)。我将自己的图像制作成 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
注:
从 ImageMagick v7 开始,您应该将
convert
替换为magick
以避免与 Windows' built-inconvert
将文件系统转换为 NTFS 的命令。ImageMagick 是一个相当大的包,你可以用 NetPBM 套件同样好地完成它,并且使用名为
pngtopnm
的工具代替convert
.