Обзор прогрессивного декодирования
В этом разделе описывается прогрессивное декодирование и использование прогрессивного декодирования в приложениях. Он также предоставляет рекомендации по созданию кодеков, поддерживающих прогрессивное декодирование.
В этом разделе содержатся следующие разделы.
- введение
- Что такое прогрессивное декодирование?
- прогрессивная поддержка декодирования в Windows 7
- Прогрессивное декодирование JPEG
- PNG/GIF Прогрессивное декодирование
- прогрессивное декодирование в приложениях
- Поддержка пользовательских кодеков для прогрессивного декодирования
- Связанные темы
Знакомство
Постепенное декодирование обеспечивает возможность добавочного декодирования и отрисовки частей изображения до завершения скачивания всего образа. Эта функция значительно улучшает взаимодействие пользователя при просмотре изображений из Интернета, так как пользователю не нужно ждать скачивания всего изображения, прежде чем декодирование может начаться. Пользователи могут просматривать предварительный просмотр изображения с доступными данными до скачивания всего образа. Эта функция необходима для любого приложения, используемого для просмотра изображений из Интернета или из источников данных с ограниченной пропускной способностью.
Компонент образов Windows (WIC) в Windows 7 поддерживает прогрессивное декодирование популярных форматов изображений, таких как JPEG, PNG и GIF. WIC также поддерживает любые совместимые с WIC кодеки, не принадлежащие Microsoft, которые реализуют прогрессивное декодирование. Прогрессивная кодировка не поддерживается в текущем выпуске WIC. В этом разделе описано прогрессивное декодирование в Windows 7 и процедура включения прогрессивного декодирования в приложениях.
Что такое прогрессивное декодирование?
Прогрессивное декодирование — это возможность добавочно декодировать части изображения из неполного файла изображения. Для традиционного декодирования требуется полный файл изображения, прежде чем декодирования может начаться. Постепенное декодирование начинается после того, как на постепенном уровне изображения завершена загрузка. Декодатор выполняет декодирования на текущем прогрессивном уровне изображения. Затем он выполняет несколько этапов декодирования изображения по мере загрузки каждого прогрессивного уровня. Каждый проход декодирования раскрывает больше изображения, пока оно не будет полностью загружено и декодировано. Количество проходов, необходимых для декодирования полного изображения, зависит от формата файла изображения и процесса кодирования изображения, используемого для создания изображения.
Изображения должны быть специально закодированы для реализации прогрессивного декодирования, но не все форматы изображений поддерживают его. В следующем списке перечислены требования к использованию прогрессивной декодирования.
- Файл изображения должен поддерживать прогрессивное декодирование. Большинство форматов изображений не поддерживают прогрессивное декодирование, хотя популярные форматы изображений JPEG, PNG и GIF делают.
- Файл изображения должен быть закодирован как прогрессивный образ. Файлы изображений, которые не были созданы с помощью прогрессивной кодировки изображений, не могут реализовать прогрессивное декодирование, даже если формат файла в противном случае будет поддерживать его.
- Кодек, поддерживающий прогрессивное декодирование, должен быть доступен. Если кодек не поддерживает прогрессивное декодирование, то изображение, закодированное как прогрессивное изображение, будет декодировано как традиционное изображение.
Поддержка прогрессивного декодирования в Windows 7
Windows 7 предоставляет встроенные кодеки, поддерживающие прогрессивное декодирование для форматов изображений JPEG, PNG и GIF. Каждый из этих кодеков Windows 7 выполняет несколько декодирующих проходов по изображению. Каждый проход соответствует определенному уровню и части изображения, которые декодируются, что в конечном итоге приводит к полностью декодированному изображению.
Каждый формат изображения обрабатывает прогрессивное декодирование по-разному. В следующей таблице приведены сведения о количестве прогрессивных уровней и методе декодирования, поддерживаемом форматами декодирования Windows 7.
Формат изображения | Число поддерживаемых прогрессивных уровней | Прогрессивный метод декодирования |
---|---|---|
JPEG | Определяется изображением | Увеличение разрешения |
PNG | 7 | Переплетение |
ГИФ | 4 | Переплетение |
Кроме того, прогрессивное декодирование можно реализовать в кодеках, обеспечивая поддержку прогрессивных интерфейсов и методов. Если прогрессивное декодирование не поддерживается в кодеке, то при вызове этих методов следует возвращать соответствующие сообщения об ошибках.
Прогрессивное декодирование JPEG
Прогрессивное декодирование JPEG предоставляет данные изображения на все более высоких разрешениях для каждого уровня до тех пор, пока изображение полного разрешения не будет доступно. Для каждого уровня изображения задан другой уровень разрешения. По мере того как все более прогрессивные уровни становятся доступными, изображение отображается на более высоких разрешениях, пока не будет разрешено полное разрешение изображения.
Количество доступных уровней и набор разрешений на каждом уровне полностью зависит от закодированного JPEG. На следующих двух изображениях показан пример прогрессивного декодирования JPEG на двух прогрессивных уровнях.
Изображение слева декодируется на прогрессивном уровне 0. Изображение справа полностью декодируется после пяти прогрессивных уровней.
Прогрессивное декодирование PNG/GIF
И PNG, и прогрессивное декодирование GIF используют перемешанный метод прогрессивного декодирования. Процесс декодирования для обоих форматов очень похож.
Прогрессивное декодирование PNG
Файлы изображений PNG предоставляют семь прогрессивных уровней для декодирования, как описано в спецификации PNG. Прогрессивное декодирование PNG реализуется путем декодирования указанного шаблона пикселей на каждом проходе декодатора. Шаблон в следующей таблице из спецификации PNG реплицируется по всему изображению. Каждое число представляет прогрессивный уровень, в котором будет декодирован соответствующий пиксель.
1 | 6 | 4 | 6 | 2 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
3 | 6 | 4 | 6 | 3 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
Из приведенной выше таблицы можно определить пиксели, которые будут декодированы с каждым проходом декодатора. В отличие от кодека GIF Windows 7, кодек PNG Windows 7 реплицирует левый самый доступный пиксель на строке сканирования, чтобы заполнить пустые пиксели.
На следующих изображениях показан пример прогрессивного декодирования кодека Windows 7 PNG на трех прогрессивных уровнях.
Изображение в левом верхнем углу отображает изображение PNG, декодирующееся на прогрессивном уровне 0. В верхнем правом углу показано то же изображение PNG, декодированное на прогрессивном уровне 3. На нижнем изображении показано то же самое изображение, которое декодировано в полном объёме после прохождения 7 прогрессивных уровней.
Прогрессивное декодирование GIF
Файлы изображений GIF предоставляют четыре прогрессивных уровня для декодирования, как описано в спецификации GIF. Каждый проход заполняет определенные строки в изображении, создавая полное изображение после четвертого прохода. В следующей таблице из спецификации GIF показано, какие строки сканирования декодируются каждым проходом декодера.
Номер уровня или номер передачи | Строки сканирования заполнены | Запуск строки сканирования |
---|---|---|
1 | Каждая восьмая строка сканирования | 0 |
2 | Каждая восьмая строка сканирования | 4 |
3 | Каждая четвертая строка сканирования | 2 |
4 | Каждая вторая строка сканирования | 1 |
Хотя кодеки могут указывать содержимое пустых пикселей на любом уровне, кодек Windows GIF заполняет пустые строки сканирования путем репликации заполненных строк сканирования над пустой строкой сканирования.
Прогрессивное декодирование в приложениях
Основным интерфейсом прогрессивного декодирования является IWICProgressiveLevelControl. Чтобы получить ссылку на интерфейс, запросите кадр изображения (IWICBitmapFrameDecode) для IWICProgressiveLevelControl. Затем прогрессивные методы доступны через интерфейс.
Приведенный ниже код содержит пример использования прогрессивного декодирования в приложениях.
IWICProgressiveLevelControl *pProgressive = NULL;
HRESULT hr = (pBitmapFrame->QueryInterface(
IID_IWICProgressiveLevelControl,
(void**) &pProgressive));
if (SUCCEEDED(hr))
{
for (UINT uCurrentLevel = 0; SUCCEEDED(hr); uCurrentLevel++)
{
hr = pProgressive->SetCurrentLevel(uCurrentLevel);
if (WINCODEC_ERR_INVALIDPROGRESSIVELEVEL == hr)
{
// No more levels
break;
}
if (SUCCEEDED(hr))
{
// Output the current level
hr = pBitmapFrame->CopyPixels(...);
}
}
}
if (pProgressive)
{
pProgressive->Release();
}
Приведенный выше код предоставляет основные функциональные возможности, необходимые для реализации прогрессивного декодирования в большинстве приложений. С помощью кода можно получить доступ к прогрессивным уровням, так как данные пикселей изображения становятся доступными. Функция SetCurrentLevel блокирует выполнение до тех пор, пока запрашиваемый уровень не будет доступен.
Поддержка пользовательского кодека для прогрессивного декодирования
Разработчики кодеков могут реализовать IWICProgressiveLevelControl, если их форматы изображений поддерживают постепенное декодирование. Поддержка прогрессивного декодирования не является необходимым условием для обнаружения и арбитража WIC. Однако постепенное декодирование значительно улучшает взаимодействие с пользователем, и при возможности следует учитывать реализацию.
Связанные разделы
-
концептуальные
-
другие ресурсы
-
Цифровое сжатие и кодировка неподвижных изображений Continuous-Tone — Требования и рекомендации