从尺寸和位深度计算jpeg大小

问题描述

我有以下详细信息的jpeg文件 ExampleJPEG File

文件大小为1342字节,如上所示,并且已由Hex Editor确认。

我当时想我也可以通过使用文件的尺寸和位深度来计算文件的大小。 即总字节数=(宽度X高度X bitDepth)/ 8

(28 X 28 X 24)/ 8 = 2352字节

为什么有这种区别?计算公式为2352字节,而实际大小为1342字节。我想念什么?

解决方法

扩展(解码)并作为字节保留在内存(RAM)中时,该图像实际上将占据2,352字节。但是JPEGs被压缩以节省磁盘,相机SD卡以及通过电子邮件发送和传输时的空间,因此它们更小且占用的空间/带宽更少。


如果要查看扩展后的RGB格式的像素强度,可以在终端/命令行中使用诸如 ImageMagick 之类的工具。让我们制作一个28x28的红色图片-现在,我将其制作为PNG格式:

magick -size 28x28 xc:red PNG24:image.png

enter image description here

现在,如果您要查看像素,则可以使用 ImageMagick 将图像转换为文本转储,如下所示:

magick image.png -depth 8 -colorspace rgb txt:

示例输出

# ImageMagick pixel enumeration: 28,28,65535,rgb
0,0: (255,0)  #FF0000  rgb(255,0)
1,0)
2,0)
3,0)
...
...
24,27: (255,0)
25,0)
26,0)
27,0)

或者,如果您想以更原始的十六进制形式查看它们:

convert image.png -depth 8 rgb:image.raw

并在十六进制编辑器中查看image.raw,或使用Linux内置工具:

convert image.png -depth 8 rgb: | xxd -g 3 -c12 | more
00000000: ff0000 ff0000 ff0000 ff0000  ............
0000000c: ff0000 ff0000 ff0000 ff0000  ............
00000018: ff0000 ff0000 ff0000 ff0000  ............

请注意,如果您检查原始,未压缩(解码)的图像的大小,则会发现它很高兴地与您计算的2,352字节相匹配:

ls -l image.raw
-rw-r--r--  1 mark  staff  2352 27 Aug 09:56 image.raw

请注意,我上面使用的是PNG而不是JPEG,因为JPEG有损,并且您没有取回保存的内容,您得到的东西看起来很相似,但是占用的空间更少-如我上面所说。

这里是一个例子。我将在黑色背景上绘制一条红线和一条绿线,并另存为PNG并计算颜色:

magick -size 100x100 xc:black +antialias -fill red -draw "line 5,5 95" -fill lime -draw "line 95,5 5,95" image.png

enter image description here

现在计算颜色:

magick -format %k image.png info:
3

现在,他与有损JPEG完全一样:

magick -size 100x100 xc:black +antialias -fill red -draw "line 5,5 95,95" image.jpg

计算JPEG中的颜色,现在有148种:

magick -format %k image.jpg info:
148

关键字:图像处理,ImageMagick,JPEG,有损,PNG无损,素数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...