Форум программистов, компьютерный форум CyberForum.ru

Запись в файл jpeg сжатых данных - C++

Восстановить пароль Регистрация
 
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
27.01.2012, 15:01     Запись в файл jpeg сжатых данных #1
здравствуйте!столкнулась с такой проблемой: мы поэтапно сжимали картинку
1.ДКП (Дискретно Косинусоидальное Преобразование)
2. Квантование
3. Вторичное сжатие( кодирование Хаффмана по дереву)
это я все сделала..проблема заключается с записью в файл таблиц хаффмана в маркер FFC4
FF C4 00 15 00 01 01 00 00 00 00

00 00 00 00 00 00 00 00 00 00 03 02

[00 15] длина: 21 байт.
[0_] класс: 0 (0 — таблица DC коэффициэнтов, 1 — таблица AC коэффициэнтов).
[_0] идентификатор таблицы: 0
Длина кода Хаффмана: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Количество кодов: [01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
Количество кодов означает количество кодов такой длины. Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами. Итак, у нас есть один код длины 1 и один — длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта.
[03] — значение 1-го кода.
[02] — значение 2-го кода.
первые два байта- это длина, третий- это класс таблицы AC или DC и идентификатор яркости или цветоразности, а вот дальше я не поняла какие данные писать то ли
1вар- это то что я закодировала Хаффмана по дереву у меня есть и коды и их длины и сам символ(который мы кодировали), надо только посчитать количество одинаковых длин и их значения и записать в файл
или
2вар- люди говорят что я все зря сделала надо записывать какие-то таблицы хаффмана общепринятые, только где их найти не знаю...
спасибо большое за помощь!очень хочу с этим разобраться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2012, 15:01     Запись в файл jpeg сжатых данных
Посмотрите здесь:

Запись данных в файл C++
Запись данных в переменную и в файл C++
C++ Запись данных в файл
C++ Запись данных в текстовый файл
C++ Запись в blob.Не сохраняет jpeg.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
27.01.2012, 19:22     Запись в файл jpeg сжатых данных #2
Думаю, здесь есть ответы на все вопросы: http://stackoverflow.com/questions/6...r-in-jpeg-file
Удачи!
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
06.02.2012, 11:24  [ТС]     Запись в файл jpeg сжатых данных #3
можно ли в файл jpeg записать свои закодированные данные полученные по дереву Хаффмана?и как это сделать?!
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
07.02.2012, 10:33     Запись в файл jpeg сжатых данных #4
Вы имеете в виду сохранить свое дерево Хаффмана?
Или сохранить данные, закодированные с его помощью?
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
07.02.2012, 16:12  [ТС]     Запись в файл jpeg сжатых данных #5
я имею ввиду как сохранить в файл jpeg в маркер ffc4 данные закодированные по моему собственному дереву хаффмана (Т.Е. НЕ СТАНДАРТНУЮ ТАБЛИЦУ ХАФФМАНА ОПИСАННУЮ В СТАНДАРТЕ JPEG)
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
07.02.2012, 22:32     Запись в файл jpeg сжатых данных #6
Насколько я понял, в маркер FFC4 сохраняется только Ваше дерево Хаффмана. Закодированные с его помощью коэффициенты должны храниться в других областях файла.

Я, к сожалению, не эксперт именно в JPEG, но логика и теория информации подсказывают, что дело должно обстоять следующим образом. Давайте рассмотрим небольшой пример. Допустим, у нас получилась таблица Хаффмана для четырех значений коэффициентов:
1 - код 0
2 - код 110
3 - код 100
5 - код 101
Ее нужно записать в JPEG. Я специально рассматриваю случай неполного дерева. Мы получаем, что у нас есть 1 код длины 1 бит и три кода длиной в три бита. Собственно, так и формируем нашу таблицу:
FF C4 - маркер
00 19 - длина (25 байт всего)
00 - класс и идентификатор таблицы
01 00 03 00 (+ еще 12 раз 00) - количество кодов заданных длин
01 03 05 02 - собственно кодируемые значения (каждое по байту, в порядке возрастания длин кодов, а затем в порядке увеличения двоичного значения кода, т.е. 100<101<110)

Думаю, алгоритм должен быть примерно такой.

Обратите внимание, что всего возможно 4 значения кодов длины 3: 100, 101, 110, 111. Мы выбрали три наименьших, иначе восстановить значения кодов будет невозможно.

P.S. Сохранение достаточно простое. А вот восстановление дерева из такого формата данных чуть сложнее. Если непонятен принцип, пишите.
Миниатюры
Запись в файл jpeg сжатых данных  
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
08.02.2012, 15:20  [ТС]     Запись в файл jpeg сжатых данных #7
СПАСИБО БОЛЬШОЕ ЗА ПОМОЩЬ! возник еще один вопрос в файле Jpeg маркеров ffc4 всего 4 штуки: 2 для яркости Y для DC и AC коэффициентов и 2 для цвенторазности для DC и AC коэффициентов, но составляющих цветоразности у нас две- Cb и Cr... в какой последовательности надо записывать в ffc4 эти составляющие для цветоразности?! сначала количество кодов для Cb+Cr, а потом Cr и Cb последовательно кодируемые значения или я опять чего-то не понимаю?!

Добавлено через 3 часа 48 минут
получается что мне нужно создать 4 своих таблицы Хаффмана закодированных по дереву 1ая-для яркости (Y) DC, 2ая-для яркости (Y) AC, 3ая-для цветоразности (Cb и Cr) DC, 4ая-для яркости (Cb и Cr) AC? я правильно понимаю?
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
08.02.2012, 22:18     Запись в файл jpeg сжатых данных #8
Насколько я помню, Cb и Cr кодируются одинаково и используют общую таблицу кодов Хаффмана. То есть кодовое дерево Хаффмана генерируется и по Cb, и по Cr. Просто накапливаете статистику по всем DC коэффициентам в обеих цветоразностных компонентах и строите дерево для DC. И аналогично с AC. И Вы совершенно правильно понимаете по количеству таблиц.
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
09.02.2012, 13:31  [ТС]     Запись в файл jpeg сжатых данных #9
а как записывать эту статистику в маркер ffc4? с количеством кодов заданных длин понятно...а вот с самими кодируемыми значениями не очень. если мы кодируем Diff = DC[i]-DC[i-1] в цветоразности Cr и Cb какая из Diff этих составляющих пишется первой Cr или Cb?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 18:38     Запись в файл jpeg сжатых данных
Еще ссылки по теме:

Запись данных в файл C++
Запись данных в файл C++
Запись данных в файл C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
10.02.2012, 18:38     Запись в файл jpeg сжатых данных #10
Не очень понял вопрос. Но кодирование цветоразностей идет так:
- Сначала по обеим цветоразностям мы строим одно кодовое дерево для DC и одно для AC. То есть, при вычислении статистики мы не разделяем данные на Cb и Cr, а воспринимаем и те, и другие как просто цветоразностные компоненты
- Насколько я помню, сначала кодируется вся компонента Cb (с помощью этих двух кодовых деревьев), а потом вся Cr (с помощью этих же деревьев)
Yandex
Объявления
10.02.2012, 18:38     Запись в файл jpeg сжатых данных
Ответ Создать тему
Опции темы

Текущее время: 12:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru