从人民广场到市政府站,有一条路非常适合骑行,笔直通畅。这让我想起在技术世界里,有些古老格式的转换过程也同样直接,比如今天要讲的 macptopbm 命令。
一、什么是 macptopbm
macptopbm - 将 MacPaint 文件转换为可移植位图(Portable Bitmap)。它是 Netpbm 工具集中的一个经典命令,主要作用是将早期的 MacPaint 格式图片转换为标准的 PBM(Portable Bitmap)位图格式。
其官方手册可参考: https://man.he.net/man1/macptopbm
安装方法很简单,你可以通过系统自带的镜像源进行 yum 安装:
# 先查看属于具体什么包,这里看到属于 netpbm-progs
[root@bogon yum.repos.d]# yum provides */macptopbm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
netpbm-progs-10.79.00-7.el7.x86_64 : Tools for manipulating graphics files in netpbm supported formats
Repo : centos
Matched from:
Filename : /usr/bin/macptopbm
netpbm-progs-10.79.00-7.el7.x86_64 : Tools for manipulating graphics files in netpbm supported formats
Repo : @centos
Matched from:
Filename : /usr/bin/macptopbm
# 安装
yum install -y netpbm-progs
二、命令选项
[root@bogon yum.repos.d]# macptopbm --h
macptopbm: usage: macptopbm [-extraskip N] [macpfile]
-extraskip 此标志用于解决从 Mac 环境传输文件到 Unix 环境时的一些问题。
大多数传输方法会保持 Mac 文件原样,但少数方法会在 Unix 文件的开头添加 "finderinfo"(查找器信息)数据。
这意味着在读取文件时需要额外跳过 128 个字节。需要留意的症状是:生成的 PBM 文件看起来会向一侧偏移。
如果出现这种情况,请尝试使用 -extraskip 128,如果效果仍不理想,可以尝试其他数值。
所有标志(选项)都可以缩写为其最短的唯一前缀。
三、实战示例
1、环境准备
为了进行完整测试,我们还需安装 ImageMagick 来生成 MacPaint 格式的源文件。
sudo yum install -y ImageMagick
[root@bogon test]# ls
1604808587070.jpg
[root@bogon test]# convert 1604808587070.jpg -monochrome pbm:temp.pbm
[root@bogon test]# ls -lth
total 300K
-rw-r--r-- 1 root root 175K May 30 14:47 temp.pbm
-rw-r--r-- 1 root root 124K May 30 14:39 1604808587070.jpg
[root@bogon test]# pbmtomacp temp.pbm > output.macp
pbmtomacp: 576 of 918 input columns will be output
pbmtomacp: 720 out of 1550 input rows will be output
[root@bogon test]# ls -lth
total 348K
-rw-r--r-- 1 root root 47K May 30 14:47 output.macp
-rw-r--r-- 1 root root 175K May 30 14:47 temp.pbm
-rw-r--r-- 1 root root 124K May 30 14:39 1604808587070.jpg
- 转换成功标志:
pbmtomacp 顺利执行并生成了 output.macp 文件(大小为 47K)。
- 关于警告信息:
576 of 918 input columns... 这类提示并不是报错。这是因为原始的 MacPaint 格式对图片尺寸有严格限制(最大只支持 576x720 像素)。原图分辨率比较大,所以工具自动把图片裁剪到了 MacPaint 能容纳的最大尺寸,这是该工具的正常行为。
2、转回 PBM 格式与偏移修复
现在我们再把生成的 .macp 文件转换为 PBM:
# 再转换 pbm 格式
[root@bogon test]# macptopbm output.macp > pbmoutput.pbm
macptopbm: Input file does not start with a MacBinary header.
macptopbm: MacPaint version (at offset 0): 00 00 00 00 (valid)
macptopbm: Input file starts with valid MacPaint header.
[root@bogon test]# ls
1604808587070.jpg output.macp pbmoutput.pbm temp.pbm
正如手册中提到的,从 Mac 系统传输某些文件到 Linux/Unix 时,可能会在文件开头多出 128 字节的 "finderinfo" 数据。这会导致图片“向一侧偏移”。此时可以使用 -extraskip 参数跳过这些多余字节。如果 128 依然不对,可以根据实际情况调整后面的数字。
# 尝试跳过前 128 个字节进行转换
[root@bogon test]# macptopbm output.macp > pbmoutput.pbm
macptopbm: Input file does not start with a MacBinary header.
macptopbm: MacPaint version (at offset 0): 00 00 00 00 (valid)
macptopbm: Input file starts with valid MacPaint header.
[root@bogon test]# ls
1604808587070.jpg output.macp pbmoutput.pbm temp.pbm
[root@bogon test]# vim pbmoutput.pbm
[root@bogon test]# macptopbm -extraskip 128 output.macp > fixed_output.pbm
macptopbm: MacPaint version (at offset 0): 00 00 00 00 (valid)
macptopbm: Input file starts with valid MacPaint header.
macptopbm: Warning: Corrupt image data. 677 rows misaligned.
[root@bogon test]# ls -lth
total 452K
-rw-r--r-- 1 root root 51K May 30 14:56 fixed_output.pbm
-rw-r--r-- 1 root root 51K May 30 14:52 pbmoutput.pbm
-rw-r--r-- 1 root root 47K May 30 14:47 output.macp
-rw-r--r-- 1 root root 175K May 30 14:47 temp.pbm
-rw-r--r-- 1 root root 124K May 30 14:39 1604808587070.jpg
[root@bogon test]#
macptopbm output.macp > pbmoutput.pbm 这是最基础的转换方式。它会从文件的第 0 个字节开始,按标准的 MacPaint 格式去读取数据。
macptopbm -extraskip 128 output.macp > fixed_output.pbm 加了 -extraskip 128 参数后,程序会先跳过文件开头的 128 个字节,然后再开始读取真正的图片信息。这个功能原本是为了解决早期从 Mac 向 Unix/Linux 传输文件时,多出来的元数据导致图片错位的问题。
你看到的警告 Warning: Corrupt image data. 677 rows misaligned.,是因为 output.macp 是由 ImageMagick 刚刚在 Linux 环境下生成的纯净标准的 MacPaint 文件,开头并没有那多余的 128 字节的冗余数据。强行加上 -extraskip 128,相当于把正常图片数据的“前半截”硬生生切掉,导致剩下的数据发生位移,macptopbm 无法正确识别每一行,所以报出“行未对齐”。
四、格式补充
生成的 .macp 是一种极其复古的位图格式(诞生于上世纪80年代)。它的核心特点就是只能保存纯黑和纯白两种颜色(即 1-bit 黑白位图),不支持任何彩色或灰度信息。因此,如果现在打开 output.macp 查看,会发现它变成了一张高对比度的黑白像素画,这正是该格式的预期效果(我在 Windows 或者 Linux 上并不能直接查看)。
参见 (SEE ALSO)
picttoppm(1), pbmtomacp(1), pbm(5)
作者 (AUTHOR)
版权所有 (C) 1988 by Jef Poskanzer。MacPaint 读取代码版权所有 (c) embed by Patrick J. Naughton ( naughton@wind.sun.com )。
五、总结
本次对 macptopbm 的测试讲解主要涉及两个软件包:一个提供 macptopbm 命令本身,另一个用于将 jpg 转换为 .macp 格式。
sudo yum install -y netpbm-progs
sudo yum install -y ImageMagick
总结来说,macptopbm 是 Linux/Unix 系统下 Netpbm 图像处理工具集 中的一个经典格式转换命令。它的核心作用和特点可以归纳为以下三点:
- 专属的格式转换器:主要功能是将上世纪80年代 MacPaint 软件专用的古老位图格式(
.macp),转换为通用的标准 PBM(Portable Bitmap)黑白位图格式。
- 复古的黑白位图处理:由于
.macp 是一种极早期的图像格式,它只支持纯黑和纯白的像素点(1-bit)。因此,转换出来的图片必然是高对比度的黑白像素画。
- 具备数据修复能力:通过特殊的
-extraskip 参数,可以有效修复因传输过程中混入冗余元数据而导致的图片“花屏”或错位问题。
它就像是架在现代 Linux 系统与几十年前 Mac 经典绘图格式之间的一座“桥梁”。