我正在制作一个数据存储设备,它可以在几个小时内拍摄一定数量的夜空照片,并且这些照片将在拍摄完成后立即下载。存储卡必须能够一次性存储所有照片。
拍摄的 JPEG 图像尺寸为 640x480 像素,因此存储卡必须有足够的空间来存储所有 100 张图像。那么 640x480 JPEG 的最大尺寸是多少呢?
我拍了一些测试照片来弄清楚这一点:
- “stackoverflow”图像的文件大小为 73,774 字节。
- 白色图像的文件大小仅为36,607字节。
- 但是方格照片的文件大小却高达 149,339 字节。
我假设文件大小随着复杂性的增加而增加。
在不知道这些图片有多复杂、尺寸有多大的情况下,我怎样才能在存储卡上留出足够的空间来容纳 100 张 640x480 JPEG 图片?我不想浪费额外的空间,因为我可能会制作许多这样的捕获设备。
答案1
这里我建议 JPEG 文件大小的上限。请参阅Ilmari Karonen 的回答以讨论更典型的 jpeg 尺寸。
640X480 32 位位图图像的像素存储空间可以这样计算(基于这答案,但根据 Ignacio Vazquez-Abrams 的评论进行了更正,这回答):
假设文件未经过压缩,则有 307,200 个像素,即 0.3MP。方便的查找表
如果每个像素包含 32 位信息,那么
- 307,200 * 32 = 9,830,400 比特信息
- 除以8位,得到一个字节值
- 9,830,400 / 8 = 1228800 字节(或 1.17 Mb)
这是未压缩位图的大小,因此应该是 jpeg 文件大小的上限(实际上,由于 JPEG 格式使用压缩,您的图像应该小得多,特别是考虑到您正在拍摄夜空,我认为夜空包含大量黑色。请注意,您的问题中最大的示例图像只有 0.14 MB)。
但是,就您的具体问题而言,即使使用该上限,100 张图片也只有 117 MB,而且我已经很久没有见过小到 128 MB 的存储卡了。我怀疑目前任何可用的存储卡都有足够的容量来满足您的需求。
显然,jpeg 文件的最大大小问题存在一些争议。这Stack Overflow 的答案表明理论上的最大尺寸为每像素 20.25 字节,或者在您的情况下为 5.9 MB,但生成这种大小的图像需要故意滥用 jpeg 格式的压缩方案,因此您极不可能看到相机生成这样的东西。
答案2
只是为了检查一下,让我测试一下ForeverWintr 的分析实验性地。
JPEG 压缩最糟糕的输入图像类型(或任何压缩)是均匀随机的 RGB 噪声,理论上是不可压缩的。因此,让我使用网络结构工具:
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(均匀随机 RGB 噪声,无损 PNG 格式,903 kb)
注(2017 年 3 月):我确信上面的图片曾是当我第一次写下这个答案并在 2013 年上传它时,它是 PNG 格式的。 (下面甚至有一条关于色彩管理的评论强烈暗示了这一点。)不幸的是,它似乎在某个时候被默默地转换成了 JPEG,使得这里的视觉比较毫无用处。
我尝试重新上传新的 PNG 测试图像,但显然它达到了 imgur 上的某种任意 PNG 文件大小限制,并自动转换为 JPEG。我不确定是否有办法解决这个问题,但至少如果你有 Linux 机器,你随时可以重新运行给定的命令来生成你自己的测试图像。无论如何,除了阻止直接目视比较压缩质量外,这不会以任何方式使下面的分析无效。
好的,所以未压缩的 PPM 文件长度为 640 × 480 × 3 = 921,600 字节,加上 15 字节的最小 PPM 标头,正如预期的那样。尝试使用 PNG 格式对其进行无损压缩最终只会使大小增加 2157 字节,这可能是 PNG 标头和元数据占用的,也可能是压缩算法在尝试压缩不可压缩数据时效率略低。
(是的,每个像素占用 3 个字节,而不是 4 个字节;即使是 PPM 格式,这种图形文件格式最简单的形式,也不会愚蠢到在磁盘上存储每个像素无用的第四个字节。可能出于对齐原因,在内存中执行此操作有一定的优势,尤其如果您还需要存储 alpha 通道,但将图像写入文件时这些原因并不适用。)
好的,那么 JPEG 呢?让我们首先尝试最小化压缩损失(质量 = 100,无色度子采样,浮点 DCT)。不幸的是,pnmtojpeg
手动的没有清楚地解释如何设置所有相关选项(具体来说,该-sample
选项列在“向导选项”部分,该部分仅引用 libjpeg 文档中的一个文件),因此我将在 GIMP 中转换它。生成的文件如下所示:
897249 rnd.jpg
(JPEG 压缩 RGB 噪声,质量 = 100,无色度子采样,876 kb)
什么,怎么可能更小?我刚才不是说纯噪音是不可压缩的吗?事实上,即使是在最高质量下,普通的 JPEG 压缩也不是相当无损。在 GIMP 中重新打开图像并将其与原始图像进行比较,可以看到某些像素的颜色值偏移了一到两级(共 256 级)。这些像素是 JPEG 压缩算法“作弊”的,它估计变化不会很明显,所以在这里丢弃了一些,在那里丢弃了另一些。事实上,对于肉眼来说,结果与原始图像几乎没有区别,但即使考虑到标头和编码开销,这些丢弃的位也确实使文件大小明显减小。
这就是最高质量了;那么更典型的设置呢,比如pnmtojpeg
默认设置(质量 = 75,启用子采样)?让我们尝试一下:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG 压缩 RGB 噪声,质量 = 75,色度子采样,184 kb)
哇,从 901 降至 184 kb!不过,这是相当激进的压缩,仔细比较图像时,您肯定能看出差异。大部分原因是色度二次采样,它基本上只是丢弃了 75% 的颜色(色调/饱和度)数据。在禁用二次采样的 GIMP 中尝试此操作会得到一个 350,618 字节的文件,即使放大后,它看起来(至少在人眼看来)仍然非常接近原始文件。
无论如何,这一切的目的是为了证明,无论你的夜空照片有多嘈杂,无论你选择的质量有多高,总有决不640 × 480 JPEG 文件可能比 900 kb 大得多。(除非您的相机附加了数兆字节的 Exif 颜色配置文件或类似愚蠢的东西。)如果您使用更典型的 JPEG 压缩设置,则最大可能文件大小会降至约 200 kb 左右。