640x480 JPEG 的最大尺寸是多少?

Blu*_*Ice 25 jpeg memory-card images

我正在创建一个数据存储设备,它可以在几个小时内拍摄一定数量的夜空照片,并且这些照片将在拍摄完后立即下载。存储卡必须能够一次存储所有图片。

将要拍摄的 JPEG 为 640x480 像素,并且存储卡上必须有足够的空间来容纳所有 100 个像素。那么 640x480 JPEG 的最大尺寸是多少?

我拍了一些测试图片来解决这个问题:

#1#2#3

  • “stackoverflow”图像的文件大小为 73,774 字节。
  • 白色图像的文件大小仅为 36,607 字节。
  • 但是方格照片的文件大小为 149,339 字节。

我假设文件大小随着复杂性而增加。

我怎样才能在存储卡上建立足够的空间来容纳 100 个 640x480 JPEG,而不知道它们会有多复杂和大小?我不想浪费额外的空间,因为我可能正在制作许多这些捕获设备。

Ilm*_*nen 35

只是为了检查,让我通过实验测试ForeverWintr 的分析

JPEG 压缩(或任何压缩,实际上)最糟糕的输入图像是均匀随机的 RGB 噪声,理论上是不可压缩的。所以让我使用netpbm工具生成一些:

$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772  rnd.png
921615  rnd.ppm
Run Code Online (Sandbox Code Playgroud)

均匀随机RGB噪声,无损PNG格式
(均匀随机 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
Run Code Online (Sandbox Code Playgroud)

JPEG 压缩 RGB 噪声,质量 = 100,无色度子采样
(JPEG 压缩 RGB 噪声,质量 = 100,无色度子采样,876 kb)

什么,怎么能小?我刚才不是说纯噪音是不可压缩的吗?好吧,问题是,即使在最高质量下,正常的 JPEG 压缩也不是完全无损的。在 GIMP 中重新打开图像并将其与原始图像进行比较,可以看到某些像素的颜色值已经移动了一两步(共 256 个)。这些是 JPEG 压缩算法“欺骗”并在此处丢弃的像素,另一个在此处丢弃的像素,估计变化不会很明显。事实上,对于肉眼来说,结果与原始结果完全没有区别,但即使考虑到标头和编码开销,这些丢弃的位加起来确实会导致文件大小的可测量减少。

所以这是最高质量;更典型的设置怎么样,比如pnmtojpeg默认值(质量 = 75,启用二次采样)?让我们试试看:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg
Run Code Online (Sandbox Code Playgroud)

JPEG 压缩 RGB 噪声,质量 = 75,色度子采样
(JPEG 压缩 RGB 噪声,质量 = 75,色度子采样,184 kb)

哇,从 901 降到 184 kb!不过,这是非常激进的压缩,在仔细比较图像时,您绝对可以分辨出差异。大部分是因为色度子采样,它基本上只是丢弃了 75% 的颜色(色调/饱和度)数据。在禁用二次采样的 GIMP 中尝试它会得到一个 350,618 字节的文件,即使在放大时,它看起来(至少在人眼看来)仍然非常接近原始文件。

无论如何,这一切的关键是要证明,无论多么嘈杂的夜空照片可能是,无论你可能在如何高品质的选择,但只是没有办法一个640×480的JPEG文件,可以得到比900显著大KB。(好吧,除非你的相机附加了一个多兆字节的 Exif 颜色配置文件或其他同样愚蠢的东西,那就是。)如果你使用更典型的 JPEG 压缩设置,最大似是而非的文件大小会下降到大约 200 kb 左右.

  • *理论上不可压缩*仅适用于无损压缩,对吗? (4认同)

For*_*ntr 22

在这里,我建议 JPEG 文件大小的上限。有关更典型的 jpeg 大小的讨论,请参阅Ilmari Karonen 的回答

640X480 32 位位图图像的像素存储空间可以这样计算(基于答案,但根据 Ignacio Vazquez-Abrams 的评论和答案进行了更正):

假设没有对文件进行压缩,则有 307,200 个像素,即 0.3MP。方便的查找表

如果每个像素包含 32 位信息,则

  1. 307,200 * 32 = 9,830,400 位信息
  2. 除以8位成为一个字节值
  3. 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 格式的压缩方案,因此您极不可能看到这样的照相机产生的东西。

  • 在实践中,虽然有些系统可能将 RGB 图像数据存储为每像素 4 个字节_在内存_中,但几乎所有图像_文件_格式最多使用每像素 3 个字节(除非在第四个字节中存储了实际的 alpha 通道)。看我下面的回答。 (3认同)