Поделиться через


Общие сведения о прогрессивном декодировании

В этом разделе описывается прогрессивное декодирование и использование прогрессивного декодирования в приложениях. В ней также приведены рекомендации по созданию кодеков, поддерживающих прогрессивное декодирование.

В этом разделе содержатся следующие подразделы.

Введение

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

Компонент обработки изображений Windows (WIC) в Windows 7 поддерживает прогрессивное декодирование популярных форматов изображений, таких как JPEG, PNG и GIF. WIC также поддерживает любые сторонние кодеки с поддержкой WIC, которые реализуют прогрессивное декодирование. Прогрессивное кодирование не поддерживается в текущем выпуске WIC. В этом разделе описывается прогрессивное декодирование в Windows 7 и процедура включения прогрессивного декодирования в приложениях.

Что такое прогрессивное декодирование?

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

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

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

Поддержка прогрессивного декодирования в Windows 7

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

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

Формат образа Число поддерживаемых прогрессивных уровней Метод прогрессивного декодирования
JPEG Определяется изображением Увеличение разрешения
PNG 7 Переплетения
GIF 4 Переплетения

 

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

Прогрессивное декодирование JPEG

Прогрессивное декодирование 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

 

Из приведенной выше таблицы можно определить пиксели, которые будут декодированы при каждом проходе декодера. В отличие от кодека Windows 7 GIF, кодек Windows 7 PNG реплицирует самый левый доступный пиксель в строке сканирования для заполнения пустых пикселей.

На следующих рисунках показан пример кодека с прогрессивным декодированием Windows 7 PNG на трех прогрессивных уровнях.

Примеры прогрессивного декодирования PNG

На изображении в левом верхнем углу отображается изображение PNG, декодированное на прогрессивном уровне 0. На правом верхнем изображении отображается то же изображение PNG, декодированное на прогрессивном уровне 3. На нижнем изображении показано то же изображение, полностью расшифрованное после 7 прогрессивных уровней.

Прогрессивное декодирование GIF

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

Номер уровня или номер прохода Заполненные строки сканирования Начальная строка сканирования
1 Каждая восьмая строка сканирования 0
2 Каждая восьмая строка сканирования 4
3 Каждая четвертая строка сканирования 2
4 Каждая секундная строка сканирования 1

 

Хотя кодеки могут указывать содержимое пустых пикселей на любом определенном уровне, кодек Windows GIF заполняет пустые строки сканирования, реплицируя заполненные строки сканирования над пустой строкой сканирования.

Прогрессивное декодирование в приложениях

Интерфейсом main прогрессивного декодирования является интерфейс 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. Тем не менее, прогрессивное декодирование значительно улучшает взаимодействие с пользователем, и по возможности следует рассмотреть реализацию.

Основные понятия

Общие сведения о компоненте обработки образов Windows

Другие ресурсы

Цифровое сжатие и кодирование Continuous-Tone неподвижных изображений — требования и рекомендации

Формат обмена файлами JPEG

Спецификация GIF89a

Спецификация и расширения переносимой сетевой графики (PNG)