Расчет размера jpeg на основе размеров и разрядности

У меня есть файл jpeg со следующей информацией: файл ExampleJPEG

Размер файла составляет 1342 байта, как показано выше, а также подтверждено Hex Editor.

Я думал, что могу также рассчитать размер файла, используя его размеры и битовую глубину. Т.е. Всего байтов = (Ширина X Высота X Битовая Глубина) / 8

(28 X 28 X 24) / 8 = 2352 байта

Почему такая разница? Формула расчета говорит о 2352 байтах, тогда как фактический размер составляет 1342 байта. Что мне не хватает?


person TestUser    schedule 26.08.2020    source источник
comment
Решил ли мой ответ вашу проблему? Если да, то примите его как свой ответ, щелкнув пустую галочку / галочку рядом с подсчетом голосов. Если нет, скажите, что не сработало, чтобы я или кто-то еще мог вам помочь. Спасибо. meta.stackexchange. ru / questions / 5234 /   -  person Mark Setchell    schedule 31.08.2020


Ответы (1)


При расширении (декодировании) и хранении в виде байтов в памяти (ОЗУ) изображение действительно будет занимать 2352 байта. Но JPEG сжимаются для экономии места на диске, SD-картах камеры, а также при отправке по электронной почте и передаются, поэтому они меньше по размеру и занимают меньше места / полосы пропускания.


Если вы хотите увидеть интенсивность пикселей в их расширенном формате RGB, вы можете использовать такой инструмент, как ImageMagick в Терминале / командной строке. Сделаем красное изображение 28x28 - пока сделаю его в формате PNG:

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

введите описание изображения здесь

Теперь, если вы хотите просмотреть пиксели, вы можете преобразовать изображение в текстовый дамп с помощью ImageMagick следующим образом:

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

Пример вывода

# ImageMagick pixel enumeration: 28,28,65535,rgb
0,0: (255,0,0)  #FF0000  rgb(255,0,0)
1,0: (255,0,0)  #FF0000  rgb(255,0,0)
2,0: (255,0,0)  #FF0000  rgb(255,0,0)
3,0: (255,0,0)  #FF0000  rgb(255,0,0)
...
...
24,27: (255,0,0)  #FF0000  rgb(255,0,0)
25,27: (255,0,0)  #FF0000  rgb(255,0,0)
26,27: (255,0,0)  #FF0000  rgb(255,0,0)
27,27: (255,0,0)  #FF0000  rgb(255,0,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  ............

Обратите внимание, что если вы проверите размер необработанного несжатого (декодированного) изображения, вы увидите, что он успешно совпадает с вашим расчетом в 2352 байта:

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

введите описание изображения здесь

Теперь посчитайте цвета:

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 без потерь, простое.

person Mark Setchell    schedule 26.08.2020
comment
Ok. Вы имеете в виду, что я сделал расчет для декодированного изображения. Могу ли я увидеть это конкретное изображение после декодирования? - person TestUser; 26.08.2020
comment
Просто откройте его в Photoshop, GIMP, feh или Windows Picture Viewer, и эти программы будут декодировать и отображать JPEG. - person Mark Setchell; 26.08.2020
comment
Идеально. Я думаю, что моим намерением было получить представление после декодирования, как будто я вижу файл jpeg в HEX-редакторе до его декодирования. Есть ли какой-нибудь трюк, с помощью которого я мог бы увидеть декодированную версию того же файла через HEX-редактор? - person TestUser; 27.08.2020
comment
Я обновил свой ответ - взгляните еще раз. - person Mark Setchell; 27.08.2020