我有一张 1x1 大小的图片。(.png)它是一个黑色像素。我使用 Photoshop 将其创建为位图,当我保存它时,它的大小为 1.2kB+。这并不奇怪,我以为 Photoshop 还保存了一堆其他信息。
当我使用一些在线程序对其进行压缩时,我可以将其压缩到 82 字节,这很好,但仍然不是我想要的。
所以我花了 1 小时在 Paint 等软件上进行试验,但这是我得到的最好结果。我还研究了图像在计算机中的存储方式,了解到每个 RGB 像素占用 3 个字节,而位图的一个像素显然应该占用 1 位。那么为什么它占用 656 位呢?
那么图片到底是如何存储的?像素还能被进一步压缩吗?
答案1
那么,你想做什么呢?有些格式会保存附加在像素值上的额外信息(比如评论中有人提到了位图的标题信息)。要回答你的问题,你实际上只需要保存 1 位就可以保存一个像素的黑色图像,而这个位可以是 0。为什么?你只需要告诉计算机:我有一个 RGB 像素(三元组),“红色”、“绿色”和“蓝色”的数量都为零。我们可以这样想:
(0, 0, 0) ≡ R = G = B = 0
因此,我们需要仅有的一点。
由于内存被分为字(通常是 64 或 32 位二进制字),即使您的数字小于2ᵇ - 1
,您的机器仍然会占用b
一定数量的位数来保存该数字,因为这是它可以访问的最小内存单位。
这是一个小型 Python 3 程序,可绘制一位黑色图像:
import matplotlib.pyplot as plt
bit = 0
plt.imshow([[[bit] * 3]], cmap='Greys')
plt.show()
我们得到:
您想保存该信息吗?只需将 0 保存到文件中?我认为这会将 0 保存为占用b
许多位的 8 位(或 1 字节)Unicode 字符。
答案2
每种图像文件格式都有一定程度的开销,以提供某些功能,例如不同的位深度支持、alpha 通道、元数据、压缩等。
如果要保存单个像素,则需要使用开销最小的图像文件格式,例如可移植位图 (PBM) 格式,它是网络协议图像格式系列。
文件:
P1
1 1
0
表示单个黑色像素。类似地,文件:
P1
1 1
1
表示单个白色像素。您可以用任何文本编辑器创建这些,用 .pbm 扩展名保存它们,然后在 Photoshop 中打开它们。
在 Windows 上,请确保换行符是 CRLF,而不仅仅是 LF,否则 Photoshop 2021 似乎不喜欢它。这两个示例中的每一个都只有 8 个字节。