Jpg что за формат. Чем отличается Jpg от Jpeg: вся правда о форматах изображений

Произносится как «джейпег» и заключает в себе сокращенное название организации - разработчика данного формата Joint Photographic Experts Group (Объединенная группа экспертов по фотографии).

Как определить формат изображения

Определить формат изображения помогают расширения. Популярные расширения для файлов формата jpeg: .jpg, .jpeg

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

Если же этого не произошло, щелкните на изображение правой кнопки мыши и зайдите в свойства. Там будет указан тип файла, его размеры, расположение на компьютере, количество места, которое оно занимает на диске и дата создания.

Перевод изображения в формат jpeg

Перевести изображение в формат jpeg может любая программа для редактирования рисунков и фотографий.

Самой простой такой программой считается программа Paint. Наряду с блокнотом и калькулятором, она есть практически в любой операционной системе.

Щелкните правой кнопкой мыши по нужному изображению. В появившемся окне выберите функцию: «Открыть с помощью...». Всплывет еще одно окно со списком имеющихся на вашем компьютере программ, подходящих для редактирования изображений. Смело выбирайте Paint (значок с палитрой и кистью).

В программе Paint вы можете самостоятельно изменить размер изображения, выбрав функцию «Изменить размер». Менять размер можно как в пикселях, так и в процентном соотношении. Отметьте точкой нужное действие (пиксели или проценты) и установите размер по горизонтали и вертикали. Чтобы картинка при этом сохранила свой внешний вид, не убирайте галочку с функции «Сохранить пропорции».

Также вы можете слегка подкорректировать картинку, используя соответствующий инструментарий программы. Нажатием клавиши «F1» вы можете вызвать окно со справочной информацией о программе и возможностях работы с ней. Не рекомендуется корректировать в данной программе фотографии, так как впоследствии они могут иметь эффект рисунка.

Не бойтесь случайно нажать куда-то и испортить изображение! Всегда можно нажать одновременно клавиши «ctrl+ z» и отменить последнее действие. В программе Paint подряд можно отменить три последних действия.

Если в изображении вас все устраивает, и вы просто хотите поменять формат, нажмите клавишу «F12». В появившемся окне внизу введите название файла и выберите формат jpeg из списка форматов. Проверьте путь сохранения в строке под словами «Сохранить как» и нажмите кнопку «Сохранить». Вашему изображению автоматически присвоится расширение.jpeg.

Помимо Paint для перевода изображения в формат jpeg вы можете использовать фотоконвертер. Прочитать, что , а также скачать бесплатную демо-версию на 15 дней можно на сайте http://www.photoconverter.ru/help/tutorials/convert_to_jpg.html

Меняйте изображения по своему вкусу!

Формат цифровых фотографий JPEG это один из самых популярных алгоритмов хранения фотоизображений. Он был разработан в 1987 году группой объединенных экспертов по фотографии. На английском языке это пишется как Joint Photographic Expert Group. По первым буквам этих слов и был назван формат, который произносится как «джейпег».

Файловый формат JPEG изначально создавался для передачи цифровых изображений, в том числе фотографий и текстов по каналам цифровой и факсимильной связи. Для этого был разработан стандарт сжатия данных графической информации, файлы которого могут иметь расширения jpg, jpe, jpeg или jfif.

Алгоритм хранения графической информации, заложенный в файловом формате JPEG, является методом сжатия с потерями, позволяет сжимать данные с достаточно высокой скоростью и эффективностью. В формате JPEG фотографии можно сохранять с глубиной цвета до 24 бит/пиксел и размером их сторон не более 65535 пикселей (2311,93 см).

Сжатие файлов фотографий формата JPEG

Процесс сжатия цифровой фотографии в формате JPEG производится не сразу, а поэтапно. Первым делом цифровое изображение переводится из цветового пространства RGB в YCbCr. В нем компонента Y отвечает за яркость изображения и кодируется полностью. Компоненты Cb и Cr это цветоразностные каналы. Они уменьшают информацию о цвете (рис.1).

Рис.1 Соотношения цветов в формате JPEG для перевода фотографии из цветового пространства RGB в YCbCr.

Затем вся фотография разбивается на отдельные квадраты размером 8x8 пикселей и над каждым из них производится преобразование. При этом каждый квадрат в формате JPEG раскладывается на составные цвета для подсчета частоты появления их по всему полю фотографии.

Такой анализ позволяет выделить необходимую информацию о верхнем диапазоне цветового спектра изображения и частично от нее избавиться. При этом также отбрасывается и часть яркостной информации канала Y, связанная с каналами Cb и Cr. Это почти не заметно на фотографиях, но зато позволяет уменьшить размеры файлов формата JPEG.

Объем удаляемой из файла JPEG информации во время такой обработки сильно зависит от указанного уровня сжатия, и чем он больше, тем хуже качество фотографии. Полученное таким способом изображение уже ни когда нельзя вернуть к первоначальному виду. Именно по этой причине JPEG называется форматом сжатия с потерями (рис.2).

Рис.2 Пример увеличенного фрагмента фотографии формата JPEG с разным уровнем сжатия.

На завершающем этапе сжатия фотографии в формате JPEG кодируются цвета и яркость изображения. При этом сохраняются только отличия 64-х пиксельных квадратов, а вся одинаковая информация удаляется. Затем результаты такого кодирования представляются числами, которые тоже сжимаются по специальному алгоритму.

Размер файла после сжатия фотографии в формате JPEG по сравнению с исходным файлом напрямую зависит от детализации изображения и чем больше мелких деталей, тем больше размер файла. Лучше сжимаются те фотографии, где меньше шума и больше плавных цветовых и яркостных переходов. Чем выше контраст, тем хуже сжимается фотография (рис.3).

Рис.3 Файлы этих изображений в формате TIFF имеют размеры 168 Кб. В формате JPEG левая фотография имеет размер 12 Кб, а правая 29 Кб. Разница между изображениями только в цветовом шуме.

Для просмотра фотографий закодированных в формате JPEG сначала их надо декодировать. Этот процесс выполняется специальной программой также поэтапно, но в обратном кодированию порядке. При этом переход из пространства YCbCr обратно в RGB проходит уже по другим заранее определенным соотношениям (рис.4).

Рис.4 Соотношения компонентов YCbCr в формате JPEG для перевода фотографии обратно в пространство RGB.

Преимущества фотографий формата JPEG

Формат JPEG приобрел популярность в цифровой фотографии в связи с тем, что алгоритм его сжатия позволяет сильно сжимать информацию и при этом сохранять плавные переходы яркости и цвета. Файлы формата JPEG могут иметь небольшой размер и при этом сохранять приемлемое качество изображений.

Этот формат используется во всех цифровых фотокамерах для хранения полученных фотокадров. Все фотографии, сохраненные в формате JPEG можно сразу использовать по назначению. У них оптимально подобрана яркость, контрастность и насыщенность. Для их доработки не требуется какой-либо особенной программы. Все делается в фотоаппарате (рис.5).

Рис.5 Примеры стилевых настроек фотоаппарата для фотографий формата JPEG.

Кроме того, при съемке фотографий в формате JPEG процесс обработки изображения и его кодирование занимает намного меньше времени чем, например, в формате . Это позволяет увеличить скорость серийной фотосъемки и количество отснятых кадров, что бывает очень важно для таких жанров фотосъемки как «Спорт» или «Репортаж».

Фотографии в формате JPEG можно без проблем просмотреть на любом электронном устройстве, где есть такая функция: телевизор, компьютер, планшет, сотовый телефон, игровые устройства и другие. Этот стандарт кодирования изображений является универсальным. Он поддерживается на всех основных платформах – Windows, Mac OS, Linux, Android, iOS.

Размер файлов формата JPEG позволяет быстро пересылать фотографии по каналам связи, что делает его незаменимым для сети Интернет. Этот формат является основным для размещения фотографий на фото сайтах, форумах и в социальных сетях.

Недостатки формата JPEG для фотографий

Главным недостатком фотографий формата JPEG можно считать то, что их нельзя сохранять повторно. После каждого сохранения таких файлов они теряют качество изображений и чем больше уровень сжатия, тем их качество хуже. Именно по этой причине не нужно сохранять результаты промежуточной обработки фотографий в формат JPEG (рис.6).

Рис.6 Пример фрагмента одной фотографии до и после трехразового сохранения в формате JPEG со средним качеством.

Еще одним недостатком формата JPEG при редактировании фотографий является то, что он не сохраняет слои и альфа каналы. Например, нельзя отложить обработку фотографий с помощи масок или корректирующих слоев и вернуться к этой работе позже (рис.7).

Рис.7 Пример сложной обработки фотографий в программе Photoshop, результаты которой нельзя сохранить в формате JPEG.

Кроме того, при редактировании цифровых фотографий часто требуется большая глубина цвета, а в формате JPEG он ограничен 256 значениями на канал. Этого недостаточно для высококачественной цветопередачи и также является недостатком фотографий формата JPEG.

Перечисленные выше недостатки формата JPEG создают ограничения в работе фотографа по улучшению фотографий после фотосъемки, но еще есть и другие. Они ухудшают качество изображения фотографии сразу в момент их сохранения в фотокамере или при сканировании фотопленки. К таким недостаткам относятся следующие семь.

1.Искажение цвета.
2.Потеря детализации.
3.Ухудшение резкости.
4.Ореолы вокруг контуров.
5.Ступенчатость линий.
6.Появление шумов.
7.Мозаичность.

Эти недостатки фотографий формата JPEG напрямую зависят от уровня сжатия информации. Для того чтобы свести потери к минимуму следует всегда сохранять первоисточники цифровых фотографий с минимально возможным сжатием или по-другому – с максимальным качеством. При этом существуют разные шкалы для выбора качества фотографий.

Шкала качества фотографий в формате JPEG

При сохранении цифровых фотографий в формате JPEG всегда задается степень сжатия информации в относительных единицах. Чаще всего для этого используется шкала от 1 до 10 или до 12 (рис.8).

Рис.8 Окно программы Photoshop для сохранения фотографий в формате JPEG по шкале качества 1 – 12.

Для более точной установки уровня сжатия встречаются и более мелкие шкалы, например от 1 до 100. Такая шкала используется для сохранения фотографий в формате JPEG при сканировании (рис.9).

Рис.9 Окно TWAIN-драйвера для сохранения фотографий в формате JPEG при сканировании на сканере Epson.

Иногда для сохранения фотографий в формате JPEG применяются более компактные шкалы, состоящие всего из пяти или трех позиций. В таких шкалах выбирается не сжатие фотографии, а качество ее изображения и не цифрами, а словами русского или английского языка (рис.10).

Рис.10 Одно из окон программы Photoshop для сохранения фотографий в формате JPEG по упрощенной шкале.

Самая простая шкала выбора ступени качества для фотографий формата JPEG используется в цифровых фотокамерах. Она состоит всего из трех позиций, которые определяют условный размер файла фотографии. Они обозначаются буквами английского языка «L», «M», «S» от слов Large – большой, Medium - средний, Small – маленький (рис.11).

Рис.11 Две шкалы качества формата JPEG для сохранения фотографий в цифровом фотоаппарате.

При сохранении цифровых фотографий в формате JPEG важно помнить, что на разных шкалах большое число может соответствовать и качеству изображения (), и коэффициенту его сжатия (). По своей сути они являются прямой противоположностью.

В первом случаи большему числу соответствует максимальное качество изображения, а во втором минимальное. При сохранении файла формата JPEG легко ошибиться и ухудшить качество фотографии, которое потом нельзя будет восстановить. А кроме этого у формата JPEG есть и другие особенности сохранения фотографий, которые нужно обязательно знать.

Как сохранять фотографии в формате JPEG

Учитывая все достоинства и недостатки файлового формата JPEG надо уметь правильно использовать его для фотографий разного назначения. Это помогает экономить дисковое пространство для их хранения и при этом сохранять высокое качество фотоизображений.

Основной ошибкой многих фотографов является недопонимание самого принципа сжатия информации в файловом формате JPEG. Это приводит к тому, что фотографии других более «тяжелых» графических форматов для экономии места переводят в формат JPEG, обрабатывают несколько раз и при этом еще сильно сжимают.

Все это можно делать только с копиями фотографий, предназначенными для определенных целей. Важно всегда помнить о том, что формат JPEG предназначен в основном для эффективного просмотра фотографий или для их печати. Но это только в тех случаях, когда фотографии не нужно дорабатывать после фотосъемки или после сканирования.

Для повышения качества фотографий формата JPEG сначала их следует перевести в формат TIFF или PSD. Копии файлов этих форматов имеют большой размер, но зато у них отсутствуют недостатки присущие JPEG-файлам. Опять вернуть фотографии в формат JPEG можно только после окончательного завершения их обработки (рис.12).

Рис.12 Улучшение качества фотографий формата JPEG.

При любых вариантах сохранения цифровых фотографий формата JPEG надо всегда устанавливать цветовой профиль sRGB. Он поддерживается всеми графическими программами, всеми техническими устройствами и на всех платформах. Это позволяет видеть фотографии везде одинаково.

Хотя формат JPEG поддерживает и другие цветовые пространства, из-за их большого цветового охвата некоторые цвета будут обрезаны, и такие фотографии везде будут смотреться по-разному. Для сохранения других цветовых профилей с большим количеством цветов нужно использовать другие файловые форматы. О них читайте в следующих статьях.

JPG - это растровый формат записи и хранения графических изображений, высокая степень сжатия в котором достигается за счет потери качества изображения. Основан на кодировании плавных цветовых переходов и позволяет в разы уменьшить объем данных при записи изображения в файл.

Сжатие изображения осуществляется в два этапа:
1. Изображение разбивается на области и усредняется в той или иной степени в зависимости от параметра QualityКачество. Чем ниже значение этого параметра, тем сильнее будет усредняться изображение.
2. Усредненное изображение компрессируется по алгоритму, близкому к LZV-компрессии в TIF-формате.

Если Вы устанавливаете максимальное значение параметра Quality, то усреднение изображения не производится. Потери качества происходят только на этапе усреднения, поэтому JPG-файлы, записанные с максимальным значением Quality, не имеют визуально различимых потерь качества и ничем не уступают TIF-файлам с LZV-компрессией, а размер их несколько меньше из-за более эффективного алгоритма компрессии.

Принимаются макеты в формате JPG, сохраненные из программы "Adobe Photoshop" с максимальным значением параметра "Quality".

Если при сохранении JPG-файлов Вы используете какие-либо другие программы и/или значения "Quality" меньше максимального, высокое качество печати не гарантируется. Следует учитывать, что изображение, единожды сохраненное в JPG c использованием усреднения, имеет дефекты, которые невозможно устранить, причем эти дефекты особенно заметны при широкоформатной печати.

По материалам wiki энциклопедии - JPEG (произносится «джейпег», по названию организации-разработчика, англ. Joint Photographic Experts Group Объединённая группа экспертов по фотографии) - один из популярных графических форматов, применяемый для хранения фотоизображений и подобных им изображений. Файлы, содержащие данные JPEG, обычно имеют расширения.jpeg, .jfif, .jpg, .JPG, или.JPE. Однако из них.jpg самое популярное расширение на всех платформах.

Область применения данного формата:

Алгоритм JPEG в наибольшей степени пригоден для сжатия фотографий и картин, содержащих реалистичные сцены с плавными переходами яркости и цвета. Наибольшее распространение JPEG получил в цифровой фотографии и для хранения и передачи изображений с использованием сети Интернет.

С другой стороны, JPEG малопригоден для сжатия чертежей, текстовой и знаковой графики, где резкий контраст между соседними пикселами приводит к появлению заметных артефактов. Такие изображения целесообразно сохранять в форматах без потерь, таких как TIFF, GIF, PNG или RAW.

JPEG (как и другие методы искажающего сжатия) не подходит для сжатия изображений при многоступенчатой обработке, так как искажения в изображения будут вноситься каждый раз при сохранении промежуточных результатов обработки. То есть – если Вы открыли изображение JPEG в каком либо редакторе и потом сохранили его, даже не внеся никаких изменений в изображение, то данное изображение сохраняясь в формате JPEG, автоматически, используя алгоритм сжатия, будет сохраняться с изменениями присущими данному алгоритму. Эти изменения будут выражаться и в потере некоторых цветовых переходов, и оттенков, и пикселов и тд., которые на глаз практически неуловимы, но с каждым новым сохранением, конечная картинка будет существенно отличаться от исходной по качеству отображения.

JPEG не должен использоваться и в тех случаях, когда недопустимы даже минимальные потери, например, при сжатии астрономических или медицинских изображений. В таких случаях может быть рекомендован предусмотренный стандартом JPEG режим сжатия Lossless JPEG (который, к сожалению, не поддерживается большинством популярных кодеков) или стандарт сжатия JPEG-LS.

Достоинства и недостатки формата JPEG:

К недостаткам сжатия по стандарту JPEG следует отнести появление на восстановленных изображениях, при высоких степенях сжатия, характерных артефактов: изображение рассыпается на блоки размером 8x8 пикселов (этот эффект особенно заметен на областях изображения с плавными изменениями яркости), в областях с высокой пространственной частотой (например, на контрастных контурах и границах изображения) возникают артефакты в виде шумовых ореолов. Следует отметить, что стандарт JPEG предусматривает использование специальных фильтров для подавления блоковых артефактов, но на практике подобные фильтры, несмотря на их высокую эффективность, практически не используются. Однако, несмотря на недостатки, JPEG получил очень широкое распространение из-за достаточно высокой (относительно существовавших во время его появления альтернатив) степени сжатия, поддержке сжатия полноцветных изображений и относительно невысокой вычислительной сложности. К тому же изображение, сжатое в JPEG формат имеет не очень большой объем в сравнении с тем же изображении в несжатом состоянии, что очень существенно при применении данного формата для использования в сети интернет.

Алгоритм JPEG позволяет сжимать изображение как с потерями, так и без потерь (режим сжатия lossless JPEG):

Группа экспертов в области фотографии (Joint Photographic Experts Group) в дополнение к известным форматам сжатия изображений JPEG и JPEG 2000, ориентированным прежде всего на сжатие с потерями, предложила также стандарт на сжатие без потерь - JPEG-LS (в котором, однако, предусмотрен также режим сжатия с ограниченными потерями):

Формат JPEG-LS был основан на формате LOCO-I (Low Complexity Lossless Compression for Images). Алгоритм сжатия без потерь LOCO-I, принятый за основу при разработке стандарта JPEG-LS, впервые предусматривал не только lossless, но и near lossless режим (сжатие с ограниченными, задаваемыми пользователем потерями). Декодер JPEG-LS почти не отличается от кодера, поэтому этот алгоритм сжатия симметричный.

Алгоритм сжатия, лежащий в основе JPEG-LS, использует адаптивное предсказание значения текущего пиксела по окружению, включающему уже закодированные пикселы (метод Median Edge Detection), классификацию контекста, контекстное моделирование ошибки предсказания и её коррекцию, а также энтропийное кодирование скорректированной ошибки предсказания (используется кодирование Голомба-Райса). Для повышения эффективности кодирования низкоэнтропийных изображений (или фрагментов изображений) алгоритм предусматривает автоматический переход в режим кодирования длин серий, что позволяет использовать его для сжатия без потерь (или с ограниченными потерями) не только фотореалистических изображений, но и компьютерной графики.

Для цветных (многокомпонентных) изображений стандарт JPEG-LS не предписывает какого-то определённого метода преобразования цветовых компонент, поэтому программы, реализующие JPEG-LS, обычно предлагают выбрать одну схему из нескольких (независимое сжатие цветовых плоскостей, преобразование в стиле JPEG 2000 lossless mode и т.п.).

Формат JPEG-LS разрабатывался, прежде всего, для хранения изображений в медицинских целях, то есть для тех случаев, когда важно иметь большое изображение без малейших потерь качества. Как уже говорилось, за основу был взят формат LOCO-I, разработанный в стенах «HP Labs». Затем он был доработан совместными усилиями «Hewlett-Packard» и «Mitsubishi». Обе компании разрешили использовать их патенты на этот формат без оплаты лицензии, поэтому JPEG-LS можно встретить и в обычных программах для PC.

JPEG 2000 также содержит режим сжатия без потерь. Сжатие без потерь в JPEG 2000 работает медленнее и дает несколько меньшее сжатие по сравнению с JPEG-LS как на искусственных, так и на фотореалистичных изображениях.

JPEG 2000 (или jp2) - графический формат, который вместо дискретного косинусного преобразования, применяемого в формате JPEG, использует технологию вейвлет-преобразования, основывающуюся на представлении сигнала в виде суперпозиции базовых функций - волновых пакетов.

В результате такой компрессии изображение получается более гладким и чётким, а размер файла по сравнению с JPEG при одинаковом качестве оказывается меньшим. JPEG 2000 полностью свободен от главного недостатка своего предшественника: благодаря использованию вейвлетов, изображения, сохранённые в этом формате, при высоких степенях сжатия не содержат артефактов в виде «решётки» из блоков размером 8х8 пикселей. Формат JPEG 2000 так же, как и JPEG, поддерживает так называемое «прогрессивное сжатие», позволяющее по мере загрузки видеть сначала размытое, но затем всё более чёткое изображение. Пока этот формат мало распространён и поддерживается не всеми современными браузерами.

Объявление

Формат файлов JPG Raster image

Фото и изображения, которые необходимо передать по электронной почте или выложить в Интернет, должны быть сжаты с целью уменьшения времени их выгрузки и загрузки, а также с целью экономии ресурсов Интернет-канала. Для этого обычно используют изображения в формате JPG. Сжатие с потерями равномерно по всему изображению, причем чем ниже степень сжатия, тем более четким становится изображение. Цифровые фотоаппараты очень часто работают именно с файлами JPG. Кроме того, для загрузки фото в Интернете необходим именно этот формат (при этом некоторые сервисы позволяют загружать и другие файлы). Файлы JPG в наибольшей мере подходят для хранения фотографий и репродукций, а не изображений с более четкими линиями и резкой сменой цветов. Кроме того, текст также весьма плохо отображается на таких файлах.

Технические сведения о файлах JPG

Сжатие с потерями изображений JPG обычно составляет 10 к 1, что приводит к потере качества. Два основных типа изображений JPG - JPG/JFIF (используемые для хранения и отправки фотографий он-лайн), а также JPG/Exif (используемые во многих фотоаппаратах). Из-за определенного метода сжатия снимков JPG происходит определенная потеря данных, т.е. редактировать такие снимки слишком радикально не стоит, т.к. каждый сеанс редактирования уменьшает качество снимка. Это происходит из-за повторных сжатий после каждого редактирования. Файлы JPG в наибольшей степени подходят для презентации окончательного варианта снимка, в то время как для редактирование лучше всего использовать несжатые файлы. Сжатие в отношении 100 к 1 также возможно, однако потери качества будут слишком заметными. Рекомендуем не увеличивать степень сжатия выше 20 к 1. Это позволит сохранить качество снимка, а также снизить кол-во посторонней информации на фото.

Дополнительная информация о формате JPG

  • Tutorial

UPD. Был вынужден убрать моноширинное форматирование. В один прекрасный день хабрапарсер перестал воспринимать форматирование внутри тегов pre и code. Весь текст превратился в кашу. Администрация хабра не смогла мне помочь. Теперь неровно, но хотя бы читабельно.

Вам когда-нибудь хотелось узнать как устроен jpg-файл? Сейчас разберемся! Прогревайте ваш любимый компилятор и hex-редактор, будем декодировать это:

Специально взял рисунок поменьше. Это знакомый, но сильно пережатый favicon Гугла:

Сразу предупреждаю, что описание упрощено, и приведенная информация не полная, но зато потом будет легко понять спецификацию.

Даже не зная, как происходит кодирование, мы уже можем кое-что извлечь из файла.
- маркер начала. Он всегда находится в начале всех jpg-файлов.
Следом идут байты . Это маркер, означающий начало секции с комментарием. Следующие 2 байта - длина секции (включая эти 2 байта). Значит в следующих двух - сам комментарий. Это коды символов ":" и ")", т.е. обычного смайлика. Вы можете увидеть его в первой строке правой части hex-редактора.

Немного теории

Очень кратко по шагам:
Давайте подумаем, в каком порядке могут быть закодированы эти данные. Допустим, сначала полностью, для всего изображения, закодирован канал Y, затем Cb, потом Cr. Все помнят загрузку картинок на диал-апе. Если бы они кодировались именно так, нам бы пришлось ждать загрузки всего изображения, прежде чем оно появится на экране. Так же будет неприятно, если потерятся конец файла. Вероятно, существуют и другие весомые причины. Поэтому закодированные данные располагаются поочередно, небольшими частями.

Напоминаю, что каждый блок Y ij , Cb ij , Cr ij - это матрица коэффициентов ДКП, закодированная кодами Хаффмана. В файле они располагаются в таком порядке: Y 00 Y 10 Y 01 Y 11 Cb 00 Cr 00 Y 20

Чтение файла

После того, как мы извлекли комментарий, будет легко понять, что:
  • Файл поделен на секторы, предваряемые маркерами.
  • Маркеры имеют длину 2 байта, причем первый байт .
  • Почти все секторы хранят свою длину в следующих 2 байта после маркера.
Для удобства подсветим маркеры:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78



FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00 AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9

Маркер : DQT - таблица квантования.

FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF

Заголовок секции всегда занимает 3 байта. В нашем случае это . Заголовок состоит из:
Длина: 0x43 = 67 байт
Длина значений в таблице: 0 (0 - 1 байт, 1 - 2 байта)
[_0] Идентификатор таблицы: 0
Оставшимися 64-мя байтами нужно заполнить таблицу 8x8.



Приглядитесь, в каком порядке заполнены значения таблицы. Этот порядок называется zigzag order:

Маркер : SOF0 - Baseline DCT

Этот маркер называется SOF0, и означает, что изображение закодировано базовым методом. Он очень распространен. Но в интернете не менее популярен знакомый вам progressive-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.

FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01

Длина: 17 байт.
Precision: 8 бит. В базовом методе всегда 8. Как я понял, это разрядность значений каналов.
Высота рисунка: 0x10 = 16
Ширина рисунка: 0x10 = 16
Количество компонентов: 3. Чаще всего это Y, Cb, Cr.

1-й компонент:
Идентификатор: 1
Горизонтальное прореживание (H 1): 2
[_2] Вертикальное прореживание (V 1): 2
Идентификатор таблицы квантования: 0

2-й компонент:
Идентификатор: 2
Горизонтальное прореживание (H 2): 1
[_1] Вертикальное прореживание (V 2): 1

3-й компонент:
Идентификатор: 3
Горизонтальное прореживание (H 3): 1
[_1] Вертикальное прореживание (V 3): 1
Идентификатор таблицы квантования: 1

Теперь посмотрите, как определить насколько прорежено изображение. Находим H max =2 и V max =2 . Канал i будет прорежен в H max /H i раз по горизонтали и V max /V i раз по вертикали.

Маркер : DHT (таблица Хаффмана)

Эта секция хранит коды и значения полученные кодированием Хаффмана .

FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

длина: 21 байт.
класс: 0 (0 - таблица DC коэффициэнтов, 1 - таблица AC коэффициэнтов).
[_0] идентификатор таблицы: 0
Длина кода Хаффмана: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Количество кодов:
Количество кодов означает количество кодов такой длины. Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами. Итак, у нас есть один код длины 1 и один - длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта.
- значение 1-го кода.
- значение 2-го кода.

Построение дерева кодов Хаффмана

Мы должны построить бинарное дерево по таблице, которую мы получили в секции DHT. А уже по этому дереву мы узнаем каждый код. Значения добавляем в том порядке, в каком указаны в таблице. Алгоритм прост: в каком бы узле мы ни находились, всегда пытаемся добавить значение в левую ветвь. А если она занята, то в правую. А если и там нет места, то возвращаемся на уровень выше, и пробуем оттуда. Остановиться нужно на уровне равном длине кода. Левым ветвям соответствует значение 0 , правым - 1 .
Замечание:
Не нужно каждый раз начинать с вершины. Добавили значение - вернитесь на уровень выше. Правая ветвь существует? Если да, идите опять вверх. Если нет - создайте правую ветвь и перейдите туда. Затем, с этого места, начинайте поиск для добавления следующего значения.

Деревья для всех таблиц этого примера:


UPD (спасибо ): В узлах первого дерева (DC, id =0) должны быть значения 0x03 и 0x02

В кружках - значения кодов, под кружками - сами коды (поясню, что мы получили их, пройдя путь от вершины до каждого узла). Именно такими кодами (этой и других таблиц) закодировано само содержимое рисунка.

Маркер : SOS (Start of Scan)

Байт в маркере означает - «ДА! Наконец-то то мы перешли непосредственно к разбору секции закодированного изображения!». Однако секция символично называется SOS.

  FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

Длина заголовочной части (а не всей секции): 12 байт.
Количество компонентов сканирования. У нас 3, по одному на Y, Cb, Cr.

1-й компонент:
Номер компонента изображения: 1 (Y)
Идентификатор таблицы Хаффмана для DC коэффициэнтов: 0
[_0] Идентификатор таблицы Хаффмана для AC коэффициэнтов: 0

2-й компонент:
Номер компонента изображения: 2 (Cb)

[_1]

3-й компонент:
Номер компонента изображения: 3 (Cr)
Идентификатор таблицы Хаффмана для DC коэффициэнтов: 1
[_1] Идентификатор таблицы Хаффмана для AC коэффициэнтов: 1

Данные компоненты циклически чередуются.

На этом заголовочная часть заканчивается, отсюда и до конца (маркера ) закодированные данные.


0

Нахождение DC-коэффициента.
1. Читаем последовательность битов (если встретим 2 байта , то это не маркер, а просто байт ) . После каждого бита сдвигаемся по дереву Хаффмана (с соответствующим идентификатором) по ветви 0 или 1, в зависимости от прочитанного бита. Останавливаемся, если оказались в конечном узле.
10 1011101110011101100001111100100

2. Берем значение узла. Если оно равно 0, то коэффициент равен 0, записываем в таблицу и переходим к чтению других коэффициентов. В нашем случае - 02. Это значение - длина коэффициента в битах. Т. е. читаем следующие 2 бита, это и будет коэффициент.
10 10 11101110011101100001111100100

3. Если первая цифра значения в двоичном представлении - 1, то оставляем как есть: DC_coef = значение. Иначе преобразуем: DC_coef = значение-2 длина значения +1 . Записываем коэффициент в таблицу в начало зигзага - левый верхний угол.

Нахождение AC-коэффициентов.
1. Аналогичен п. 1, нахождения DC коэффициента. Продолжаем читать последовательность:
10 10 1110 1110011101100001111100100

2. Берем значение узла. Если оно равно 0, это означает, что оставшиеся значения матрицы нужно заполнить нулями. Дальше закодирована уже следующая матрица. Первые несколько дочитавших до этого места и написавших об этом мне в личку, получат плюс в карму. В нашем случае значение узла: 0x31.
Первый полубайт: 0x3 - именно столько нулей мы должны добавить в матрицу. Это 3 нулевых коэффициэнта.
Второй полубайт: 0x1 - длина коэффициэнта в битах. Читаем следующий бит.
10 10 1110 1 110011101100001111100100

3. Аналогичен п. 3 нахождения DC-коэффициента.

Как вы уже поняли, читать AC-коэффициенты нужно пока не наткнемся на нулевое значение кода, либо пока не заполнится матрица.
В нашем случае мы получим:
10 10 1110 1 1100 11 101 10 0 0 0 1 11110 0 100
и матрицу:





Вы заметили, что значения заполнены в том же зигзагообразном порядке?
Причина использования такого порядка простая - так как чем больше значения v и u, тем меньшей значимостью обладает коэффициент S vu в дискретно-косинусном преобразовании. Поэтому, при высоких степенях сжатия малозначащие коэффициенты обнуляют, тем самым уменьшая размер файла.

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Ой, я забыл сказать, что закодированные DC-коэффициенты - это не сами DC-коэффициенты, а их разности между коэффициентами предыдущей таблицы (того же канала)! Нужно поправить матрицы:
DC для 2-ой: 2 + (-4) = -2
DC для 3-ой: -2 + 5 = 3
DC для 4-ой: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

Теперь порядок. Это правило действует до конца файла.

… и по матрице для Cb и Cr:

[-1 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Так как тут только по одной матрице, DC-коэфициенты можно не трогать.

Вычисления

Квантование

Вы помните, что матрица проходит этап квантования? Элементы матрицы нужно почленно перемножить с элементами матрицы квантования. Осталось выбрать нужную. Сначала мы просканировали первый компонент, его компонента изображения = 1. Компонент изображения с таким идентификатором использует матрицу квантования 0 (у нас она первая из двух). Итак, после перемножения:


[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Аналогично получаем еще 3 матрицы Y-канала…

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

… и по матрице для Cb и Cr.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

Обратное дискретно-косинусное преобразование

Формула не должна доставить сложностей*. S vu - наша полученная матрица коэффициентов. u - столбец, v - строка. s yx - непосредственно значения каналов.

*Вообще говоря, это не совсем правда. Когда я смог декодировать и отобразить на экране рисунок 16x16, я взял изображение размером 600x600 (кстати, это была обложка любимого альбома Mind.In.A.Box - Lost Alone). Получилось не сразу - всплыли различные баги. Вскоре я мог любоваться корректно загруженной картинкой. Только очень огорчала скорость загрузки. До сих пор помню, она занимала 7 секунд. Но это и неудивительно, если бездумно пользоваться приведенной формулой, то для вычисления одного канала одного пикселя потребуется нахождения 128 косинусов, 768 умножений, и сколько-то там сложений. Только вдумайтесь - почти тысяча непростых операций только на один канал одного пиксела! К счастью, тут есть простор для отимизации (после долгих экспериментов уменьшил время загрузки до предела точности таймера 15мс, и после этого сменил изображение на фотографию в 25 раз большей площадью. Возможно, напишу об этом отдельной статьей).

Напишу результат вычисления только первой матрицы канала Y (значения округлены):


[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

И 2-х оставшихся:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

  1. О, пойду-ка поем!
  2. Да я вообще не въезжаю, о чем речь.
  3. Раз значение цветов YCbCr получены, осталось преобразовать в RGB, типа так: YCbCrToRGB(Y ij , Cb ij , Cr ij) , Y ij , Cb ij , Cr ij - наши полученные матрицы.
  4. 4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Y ij , Cb , Cr )
Если вы выбрали 1 и 4, то я рад за вас. Либо вы все правильно поняли, либо скоро будете получать удовольствие от еды.

YCbCr в RGB

R = Y + 1.402 * Cr
G = Y - 0.34414 * Cb - 0.71414 * Cr
B = Y + 1.772 * Cb
Не забудьте прибавить по 128. Если значения выйдут за пределы интервала , то присвоить граничные значения. Формула простая, но тоже отжирает долю процессорного времени.

Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8x8 нашего примера:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

Конец

Вообще я не специалист по JPEG, поэтому вряд ли смогу ответить на все вопросы. Просто когда я писал свой декодер, мне часто приходилось сталкиваться с различными непонятными проблемами. И когда изображение выводилось некорректно, я не знал где допустил ошибку. Может неправильно проинтерпретировал биты, а может неправильно использовал ДКП. Очень не хватало пошагового примера, поэтому, надеюсь, эта статья поможет при написании декодера. Думаю, она покрывает описание базового метода, но все-равно нельзя обойтись только ей. Предлагаю вам ссылки, которые помогли мне:

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Расширение файла .jpg
Категория файлов
Файл-пример (7,1 MiB)
(182,90 KiB)
Связанные программы Adobe Photoshop
Adobe Suite
Apple Preview
Corel Paint Shop Pro
Microsoft Office
Microsoft Windows Photo Gallery Viewer
Most web browsers