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

Nokia 01.05.2019
Nokia

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

В этой статье мы расскажем, как расшифровать текст с картинки онлайн? Для этой задачи создана программа FineReader, но её же нужно скачивать, устанавливать, да ещё и разбираться в функциях.

Намного проще загрузить картинку на специальный сайт и получить готовый текст, который можно скопировать и вставить в Word.

Бесплатная расшифровка текста с картинки

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

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

Работают все сервисы по распознаванию практически одинаково. Чтобы показать вам пример, мы подготовили изображение с текстом:

Теперь нужно найти систему, которая обрабатывает картинки и выдает тексты с них. Через Яндекс находим первый попавшийся сайт Img2txt.com . Через форму загрузки выбираем картинку:

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

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

Сервисы распознавания текста с картинок

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

  1. Ocrconvert.com - бесплатный сервис расшифровки текста с картинок, в котором можно сразу загрузить 5 файлов (до 5 Мб.). После распознавания выдается ссылка на файл в формате TXT (для обычного блокнота).
  2. I2ocr.com - в отличие от первого сервиса, этот поддерживает больше форматов (TIF, JPEG, PNG, BMP, GIF, PBM, PGM, PPM). Также, можно загружать картинки на 10 Мб. сразу, результат выдается в формате doc (под Word).
  3. Newocr.com - самый крупный ресурс, поддерживающий любые форматы изображений. Только здесь можно указать область картинки, с которой требуется распознать текст. Доступно 58 языков, регистрация не требуется.
  4. Onlineocr.net - чуть меньше языков поддерживает этот сервис (32). Зато здесь сразу добавляется до 15 картинок (не больше 4 Мб.) для распознавания текста. Регистрироваться и платить не нужно, результат можно скачать в разных форматах.
  5. Free-ocr.com - пользуйтесь без регистрации, распознает текст по одной странице, не больше 10 штук в час. Изображение должны быть менее 2 Мб. и с разрешением меньше 5000 пикселей.

Если кто-то предлагает вам , а работа заключается в перепечатке текста с бумажного носителя, не соглашайтесь. Это мошенники, они тоже знают о сервисах распознавания и могут ими воспользоваться.

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

1. Выберите одно изображение для преобразования.
2. Нажмите кнопку Конвертировать .




7. Пользуйтесь на здоровье

1. Выберите один ZIP файл содержащий изображения для преобразования. Только 20 файлов могут быть конвертированы одновременно.
2. Нажмите кнопку Конвертировать .
3. Файл отсылается на наш сервер и преобразование начинается немедленно.
4. Скорость преобразования зависит от размера файла, скорости Вашего интернет соединения и доступных ресурсов на наших серверах.
5. Когда преобразование закончено, файл возвращается в то же самое окно браузера (не закрывайте Ваш браузер).
6. В случае невозможности преобразования, причина будет указана красным цветом.
7. Пользуйтесь на здоровье

Выберите изображение для конвертирования Поддерживаются только JPG/JPEG/JFIF/PNG/BMP/GIF/TIF/TIFF/ICO файлы

JPEG изображение JFIF изображение BMP изображение GIF изображение PNG изображение TIF изображение ICO изображение исходного размера ICO 16x16 изображение ICO 32x32 изображение Распознавание OCR (Русский)

Идет конвертация


Это может занять несколько минут

На данной странице возможно конвертирование только JPG JPEG JFIF PNG BMP GIF TIF ICO в другие форматы изображений и распознавание Русского текста в изображениях.

  • Для конвертирования MS Word (DOC DOCX) в PDF воспользуйтесь ссылкой Word в PDF .
  • Для конвертирования RTF ODT MHT HTM HTML TXT FB2 DOT DOTX XLS XLSX XLSB ODS XLT XLTX PPT PPTX PPS PPSX ODP POT POTX в PDF воспользуйтесь ссылкой Другие документы в PDF .
  • Для конвертирования JPG JPEG PNG BMP GIF TIF TIFF в PDF воспользуйтесь ссылкой Изображение в PDF .
  • Для извлечения текста из PDF документа воспользуйтесь ссылкой PDF в TXT .
  • Для конвертирования DOC DOCX RTF ODT MHT HTM HTML TXT FB2 DOT DOTX в DOC DOCX DOT ODT RTF TXT или XLS XLSX XLSB XLT XLTX ODS в XLS XLSX или PPT PPTX PPS PPSX ODP POT POTX в PPT PPTX PPS PPSX JPG TIF PNG GIF BMP воспользуйтесь ссылкой Другие форматы .
  • Для конвертирования DOC DOCX DOT DOTX RTF ODT MHT HTM HTML TXT в FB2 воспользуйтесь ссылкой Документы в FB2 .
  • Для конвертирования PDF в MS Word (DOC, DOCX), воспользуйтесь ссылкой Конвертировать PDF в Word .
  • Для конвертирования PDF в JPG, воспользуйтесь ссылкой Конвертировать PDF в JPG .
  • Для конвертирования DJVU в PDF, воспользуйтесь ссылкой Конвертировать DJVU в PDF .
  • Для распознавания текста в PDF или изображениях, воспользуйтесь ссылкой Распознать PDF или изображение .

Выберите ZIP архив для конвертирования Поддерживаются только ZIP файлы

JPEG изображение JFIF изображение BMP изображение GIF изображение PNG изображение TIF изображение ICO изображение исходного размера ICO 16x16 изображение ICO 32x32 изображение

JPEG — это не просто формат файлов для хранения изображений, а сложный метод кодирования и декодирования изображений, который имеет множество настроек.

Современные продвинутые цифровые камеры имеют несколько основных настроек JPEG:

  1. Качество снимка JPEG
  2. Размер снимка JPEG
  3. Настройка параметров снимка

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

  • Fine — 3,4МБ
  • Norm — 1,8МБ
  • Basic — 0,9МБ

Самое интересное, что объем файлов, которые показывает камера в настройках меню является максимальным расчетным объемом при заданном кодировании. Из-за особенностей алгоритма, например, снимая с качеством Fine, вряд ли можно будет получить файл именно с 3.4МБ, обычно алгоритм справляется лучше и создает более мелкие файлы. Размер файла JPEG зависит именно от того, что имеется на изображении . Если говорить грубо, то снимок с равномерно синим небом алгоритм закодирует с минимальными затратами и в итоге получим вместо 3.4МБ примерно 1МБ. А вот если снимать ночью на высоких значениях ISO, то можно получить файл размером около 3МБ. Это связано с тем, что на высоких значениях ISO будет много цифрового шума, то есть на фотографии будет много разнородных пикселей, для которых сложно подобрать интерполяцию (усреднение) и алгоритму JPEG нужно использовать больше памяти для сохранения всех деталей на снимке.

Внимание: из-за того, что камера рассчитывает количество оставшихся кадров на карточке именно по максимальному допустимому объему снимка, реальное их количество значительно больше. Например, я использую 16GB карточку памяти на . При этом в разных режимах камера показывает:

  • Fine — 4400 фото
  • Norm — 8400 фото
  • Basic — 16.400 фото

А на самом деле у меня в режиме Fine легко помещается свыше 6000 фотографий.

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

Качество 100%. Размер файла 308 kb

Качество 70%. Размер файла 107 kb

Качество 40%. Размер файла 89,4 kb

Качество 1%. Размер файла 60,5 kb

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

Также, большинство современных цифровых камер имеют настройку размера изображения . Эта настройка показывает, сколько мегапикселей будет иметь снимок. Для примера, :

  • Большой, L (large) — 6.0MP, 3008X2000 точек
  • Средний, M (medium) — 3.3MP, 2256X1496 точек
  • Маленький, S (small) — 1.5MP, 1504X1000 точек

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

Все то же самое касается не только , которую я использовал в качестве примера, но и остальных цифровых камер.

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

Важное замечание: практически всегда можно комбинировать качество снимка и его размер . Таким образом можно подбирать любые варианты качества конечного изображения. Также, всякие манипуляции с размером и качеством JPEG очень сильно влияют на возможности буфера кадров современных камер. Чем меньше размер и чем меньше качество — тем больше фотографий может поместить в при серийной съемке. Для примера, в формате JPEG L, Fine может поместить только 7 снимков, а M, Norm целых 17. Собственно, ради манипуляций с буфером я и затевал данную статью.

Алгоритмы, по которым происходит сжатие от размера L до М или S очень сложны и их существует огромное множество. Например, уменьшение снимка можно выполнить и на компьютере, для этого программа обработчик может использовать такие алгоритмы уменьшения размера : LancZos3, Bell, Bicubic, Bilinear, BSplite, FastLinear, LancZos2, Linear, Mitchell, Nearest, Triangle и кучу других. Используя формат JPEG мы из чистой фотографии попадаем в абстрактное математическое поле матриц, векторов и умом непостижимых тонкостей.

720Х479. Файл весит 193 kb

640Х426. Файл весит 159 kb

320Х213. Файл весит 51,2 kb

160Х106. Файл весит 24,1kb

Очень часто огромного размера изображения, например, 30-ти мегапиксельные снимки на мобильные телефоны, занимают огромный объем, а весь потенциал 30-ти мегапикселей попросту не используется. Потому можно смело ставить более маленький размер снимков. От себя добавлю, что для удобного просмотра фотографий даже на самых дорогих мониторах с матрицей 2560×1600 достаточно порядка 4-х мегапиксельного снимка, а для печати форматом 10Х15 вообще нужно всего около 1 мегапикселя. Вспомните, когда в последний раз печатали фотографии, или увеличивали снимок на компьютере? Из личного опыта скажу, что огромное количество пикселей современных камер нужны только для серьезного занятия фотографией. Для обычных бытовых задач я не вижу нужды , а в камере с большим их количеством можно уменьшать размер выходного снимка без серьезной потери в качестве.

Некоторые современные камеры имеют некоторые дополнительные настройки JPEG. Например, продвинутые камеры Nikon, такие как , имеют настройку приоритета качества/размера JPEG. Эта настройка позволяет указать алгоритму на то, что важней при обработке изображения — величина файла или качество.

Важно: для наилучшего качества снимков я, все же, рекомендую использовать наибольший размер снимков с наилучшим качеством. Например, для камер Nikon это L, Fine, приоритет качества. А вот полностью весь потенциал и точность передачу изображения с матрицы на карту памяти может реализовать только формат RAW. Но даже RAW файлы в некоторых камерах проходят через специальную ‘обжимку’ для уменьшения их размеров, здесь нужно быть предельно осторожным.

Выводы:

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

Не забудьте нажать на кнопки соцсетей ↓ — для меня. Спасибо за внимание. Аркадий Шаповал.

  • 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, поэтому вряд ли смогу ответить на все вопросы. Просто когда я писал свой декодер, мне часто приходилось сталкиваться с различными непонятными проблемами. И когда изображение выводилось некорректно, я не знал где допустил ошибку. Может неправильно проинтерпретировал биты, а может неправильно использовал ДКП. Очень не хватало пошагового примера, поэтому, надеюсь, эта статья поможет при написании декодера. Думаю, она покрывает описание базового метода, но все-равно нельзя обойтись только ей. Предлагаю вам ссылки, которые помогли мне:

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

Что представляют собой форматы изображений?

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

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

Понятие векторной и растровой графики

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

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

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

PCX - формат для хранения растровых изображений с глубиной цвета 24 бита. Сжатие очень быстрое, но не подходит для преобразования детальной графики, например, фотографий.

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

Форматы файлов специализированных графических редакторов

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

PDF - формат, который может содержать текстовые и графические данные. Разработан корпорацией Adobe. Этот формат предполагает использование разных методов сжатия для каждого конкретного элемента, содержащегося в конечном файле. Сегодня он является универсальным в основном для технической документации в электронном виде.

CDR - векторный формат графического редактора Corel Draw. Обработать его можно только таким программным пакетом. Другими редакторами не поддерживается, но легко экспортируется в другие форматы.

AI - формат программы Adobe Illustrator, поддерживаемый большинством других редакторов. Главная особенность - наивысшая стабильность изображения и полная совместимость с технологией PostScript. Может использоваться как промежуточный формат при переводе из одного в другой.

PSD - лучший формат изображения программного пакета Adobe Photoshop для промежуточного редактирования сложных изображений. Позволяет использовать слои и режимы смешивания, но имеет больший размер по сравнению с другими форматами. В качестве конечного формата для сохранения файлов применяется исключительно в самой программе.

Изображения большого формата

Если говорить об большого формата, где требуется учесть высокую детализацию, то стоит использовать RAW, TIFF или PSD.

Однако, многие профессиональные фото- и видеокамеры, обладающие матрицами на уровне 20-25 Мп, имеют собственные стандарты. Большинство из них адаптировано к наиболее распространенным типам форматов. Здесь все зависит только от настроек самой камеры. То же самое касается и мобильных девайсов.

Основные типы видео и анимации

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

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

Чуть позже появились такие известные форматы, как WMV, MPG, MKV, MP4, VOB, TS и многие другие, причем последние можно рассматривать даже как форматы изображения телевизора высокого разрешения, позволяющего воспроизводить файлы со стандартами качества HD, Full HD (2k) или Ultra HD (4k).

Что касается анимации, сегодня наиболее известной является технология Flash. Изначально это была разработка корпорации Macromedia, но потом ее выкупила компания Adobe и существенно модернизировала. Формат таких файлов - SWF. Он применяется в основном для создания небольших анимационных роликов, компьютерной мультипликации, баннеров или для простеньких игр.

Мобильные системы

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

К примеру, обычные телефоны воспринимают только формат 3GP. Android или iOS рекомендуют использовать MP4. Но в целом вариантов хватает.

Изменение основных параметров изображений

Наверное, все прекрасно понимают, что редактирование нужно производить при помощи специальных программ.

Простейшие операции по изменению размера, отражению, повороту, наклону и другие можно выполнить даже в самом примитивном редакторе Paint, который входит в комплект любой «операционки» Windows.

Если же требуются более сложные действия, скажем, изменения цвета, насыщенности, контрастности, редактирование слоев, разбивка изображения на отдельные составляющие и прочее, то придется использовать профессиональные пакеты вроде вышеупомянутых Corel Draw или Adobe Photoshop.

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

Преобразование форматов

Преобразование (конвертирование) производится при помощи утилит, называемых конверторами. Один из самых ярких представителей - Xilisoft Video Converter, который умеет преобразовывать и графику, и видео.

Для графики можно предпочесть, например, ACDSee Ashampoo Photo Commander, Free Image Convert And Resize или что-то еще. Сегодня таким программ можно найти очень много.

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

Какой формат предпочесть для хранения данных?

Фото на компьютере можно хранить в универсальном JPG-формате. При их просмотре на мониторе особая четкость не нужна. Другое дело, когда фотографии нужно напечатать. Тут лучше использовать оригинальные форматы камер.

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

То же самое касается и видео. Все зависит от того, на каком устройстве оно будет просматриваться.

Заключение

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



Рекомендуем почитать

Наверх