Spec-Zone .ru
спецификации, руководства, описания, API

Спецификация Формата Метаданных JPEG и Примечания Использования

Метаданные JPEG
Сокращенные Потоки
Источники Таблиц
Преобразования Colorspace и Стандартные Маркеры
Изображения миниатюры
Прогрессивное Кодирование
Собственная Древовидная структура Формата Метаданных и Редактирование
DTD Метаданных изображения
Потоковый DTD Метаданных

ОТМЕТЬТЕ: важно вызвать dispose() на читателе JPEG и объекты писателя, когда они больше не необходимы, поскольку они используют существенные собственные ресурсы, которые не соответственно восстанавливаются сборкой "мусора". И вызов читателя и писателя dispose() в их финализаторах, но тех финализаторах, возможно, не вызывается прежде, чем собственный код исчерпал собственную память.

Писатель JPEG не поддерживает пиксели замены.

Метаданные JPEG

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

Потоковые метаданные используются только для найденных изображений только для таблиц (или быть помещенными) в начале потока, содержащего сокращенные изображения. Изображения только для таблиц не обрабатываются как изображения и не используют изображение, индексируют. Потоковый объект метаданных, возвращенный из чтения, описывает содержание сегментов маркера между SOI маркер и EOI маркер для единственного изображения только для таблиц в начале потока, если Вы присутствуете. Если никакое изображение только для таблиц не присутствует впереди потока, getStreamMetadata метод ImageReader возвраты null. Если потоковые метаданные будут предоставлены писателю, то единственное изображение только для таблиц, содержащее таблицы от потокового объекта метаданных, будет записано в начале потока. Если потоковый объект метаданных не будет содержать таблиц, то таблицы значения по умолчанию будут записаны. Поскольку единственная цель потоковых метаданных для того, чтобы определить изображения только для таблиц впереди сокращенных потоков, потоковый параметр метаданных полезен только на ImageWriter.prepareWriteSequence метод. Это игнорируется на всех других методах.

ImageWriter.getDefaultStreamMetadata метод возвращает объект, содержащий таблицы от ImageWriteParam параметр, если это - a JPEGImageWriteParam и содержит таблицы. Иначе, возвращенный объект будет содержать таблицы значения по умолчанию.

ImageWriter.getDefaultImageMetadata метод возвращает объект метаданных, не содержащий таблиц если ImageWriteParam параметр содержит таблицы. Иначе возвращенный объект метаданных будет содержать значение по умолчанию визуально таблицы без потерь. Конечно, только a JPEGImageWriteParam может содержать таблицы.

Если ignoreMetadata устанавливается в true то, когда ввод будет установлен на читателе, потоковые метаданные не будут доступны, но отобразят метаданные, будет.

Сокращенные Потоки

И читатель и писатель сохраняют их таблицы от одной работы до следующего, таким образом разрешая использование сокращенных потоков вполне естественно, с несколькими незначительными ограничениями:
  1. Сокращенные потоки могут содержать только одно изображение только для таблиц, которое должно быть на первом месте в потоке. Последующие изображения только для таблиц вызовут неопределенное поведение.
  2. Сокращенные потоки должны быть считаны полностью и в порядке. Никакой произвольный доступ не позволяется ни в одном направлении. То же самое изображение может быть считано многократно. Если вызов выполняется с изображением, индексируют, который не является тем же самым как или одно большее чем новый вызов (или 0, если никакие вызовы не были выполнены), то IllegalArgumentException бросается.
Эти ограничения означают, что потоки могут содержать сокращенные изображения, вкрапленные изображениями, содержащими таблицы. Как требуется JPEG, любые таблицы, появляющиеся в потоке, переопределяют предыдущие таблицы, независимо от источника предыдущих таблиц.

Отметьте, что, как только изображение только для таблиц было считано, это - содержание, доступно как потоковые метаданные от читателя, пока или другое изображение только для таблиц не читается из другого потока или читателя, сбрасывается. Изменение ввода не сбрасывает потоковые метаданные. Это полезно для чтения таблиц из одного файла, затем изменяя ввод, чтобы считать сокращенный поток, содержащий последовательность изображений. Таблицы будут использоваться автоматически, и останутся доступными как "потоковые" метаданные.

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

Источники Таблиц

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

  1. Если есть ImageWriteParam и режим сжатия устанавливается в EXPLICIT, созданное использование таблиц значения по умолчанию качественной установки используется. Они пишутся, только если метаданные содержат таблицы или если нет никаких метаданных, но они заменяют таблицы в метаданных.
  2. Если есть ImageWriteParam и режим сжатия устанавливается в DEFAULT, примите значение по умолчанию визуально lossles, таблицы используются. Они пишутся, только если метаданные содержат таблицы или если нет никаких метаданных, но они заменяют таблицы в метаданных.
  3. Иначе режим сжатия на ImageWriteParam должен быть MODE_COPY_FROM_METADATA, когда следующее используется:
    1. таблицы в метаданных изображения, если существующий
    2. таблицы в потоковых метаданных, если существующий
    3. таблицы в JPEGImageWriteParam, если существующий
    4. примите значение по умолчанию визуально таблицы без потерь
    Таблицы пишутся, только если они берутся от метаданных изображения.
Это упорядочивание реализует намерение проекта, что таблицы должны быть включены в JPEGImageWriteParams только как средство определения таблиц, когда никакой другой источник не доступен, и это может произойти только при записи в сокращенный поток без таблиц, используя известные нестандартные таблицы для сжатия.

Читая, таблицы в a JPEGImageReadParam консультируются, только если на столы не накрыло никакое предыдущее чтение. На столы накрывают от a JPEGImageReadParam переопределяются любыми таблицами, существующими в считанном потоке.

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

Преобразования Colorspace и Стандартные Маркеры

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

Дополнительная поддержка ColorSpace: Обрабатывая PhotoYCC (YCC), PhotoYCCA (YCCA), цветовые пространства RGBA и YCbCrA стандартным плагином, как описано ниже, зависят от возможностей библиотек, пользовавшихся, чтобы интерпретировать данные JPEG. Таким образом все последовательные поведения являются дополнительными. Если поддержка не будет доступна, декодируя, то цветовое пространство будет обработано как нераспознанное, и соответствующее пространство цвета по умолчанию для конкретного количества компонентных каналов может быть использовано. При записи Исключение может быть выдано, если никакое подходящее преобразование не может быть применено перед кодированием. Но где поддержка этих цветовых пространств доступна, поведение должно быть как задокументировано.

Читая, содержание потока интерпретируется обычными соглашениями JPEG, следующим образом:

Как только закодированный colorspace определяется, тогда цель colorspace определяется следующим образом:

Для того, чтобы записать, цветное преобразование, чтобы применяться определяется следующим образом:

Если подмножество исходных полос должно быть записано, никакое цветное преобразование не выполняется. Любое место назначения, если установлено, должно соответствовать число полос, которые будут записаны, и служат интерпретацией выбранных полос, а не запросом преобразования. Это поведение идентично этому для Rasters. Если все полосы должны быть записаны и изображение (в противоположность a Raster) пишется, любой целевой тип игнорируется, и предупреждение отправляется любым слушателям.

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

Когда полное изображение будет записано, место назначения colorspace будет выбрано основанное на содержании изображения и настройках метаданных согласно следующему алгоритму:

Если никакой объект метаданных не определяется, то следующие значения по умолчанию применяются:

Объекты метаданных значения по умолчанию для этих типов изображения отразят эти настройки.

Если объект метаданных определяется, то число каналов во фрейме и заголовках сканирования должно всегда соответствовать число полос, которые будут записаны, или исключение выдается. app0JFIF и app14Adobe узлы могут появиться в том же самом объекте метаданных только если app14Adobe узел указывает на YCbCr, и компонентные идентификаторы JFIF совместимый (0-2). Различные типы изображения обрабатываются следующими способами:
(Все многоканальные изображения подвыбираются согласно факторам выборки в узле заголовка фрейма объекта метаданных, независимо от цветового пространства.)

Изображения миниатюры

Миниатюры поддерживаются при помощи JFIF и сегментов маркера расширения JFIF. Миниатюры, обеспеченные на методах записи, определяют миниатюры, которые будут включены. app0JFIF и app0JFXX узлы, существующие в метаданных, не содержат пиксельных данных миниатюры. Однако, виды записанных миниатюр зависят от содержания объекта метаданных, следующим образом. Любая миниатюра, которая должна быть записана как индексированный или изображение RGB и которая больше чем 255 255, будет отсечена, не масштабироваться, к 255 255. Миниатюры, записанные как изображения JPEG, могут быть любым размером. Предупреждение отправляется любым слушателям всякий раз, когда миниатюра отсекается.

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

Прогрессивное Кодирование

Прогрессивное кодирование должно быть включено на ImageWriteParam переданный в к операции записи, или изображению будет записан последовательно, независимо от заголовков сканирования, включенных в объект метаданных. Если прогрессивное кодирование включается и устанавливается скопировать с метаданных, то последовательность заголовков сканирования от метаданных используется, чтобы записать изображение. Если прогрессивное кодирование включается и устанавливается использовать значение по умолчанию, то сканирования в метаданных игнорируются, и набор значения по умолчанию сканирований используется. Прогрессивное кодирование всегда вызывает, оптимизировал таблицы Хафмана, которые будут использоваться. Любые таблицы Хаффмана, существующие в метаданных, будут проигнорированы, и предупреждение будет отправлено любым слушателям предупреждения. Если оптимизацию Таблицы Хаффмана требуют на ImageWriteParam, все таблицы Хафмана в метаданных или в ImageWriteParam непосредственно игнорируются, и предупреждение будет отправлено любым слушателям предупреждения, если какие-либо такие таблицы будут присутствовать.

Собственная Древовидная структура Формата Метаданных и Редактирование

DTD ниже описывают только деревья объектов метаданных, фактически возвращенных IIOMetadata объект. Они не включают соответствие узлов SOI, EOI, или RST маркеры, поскольку эти разделители парсинга не переносят значимых метаданных.

Первый узел всегда a JPEGvariety узел. В javax_imageio_jpeg_image_1.0 версия формата метаданных JPEG, у этого узла может быть один дочерний элемент, app0JFIF узел, указывая, что поток JPEG содержит сегмент маркера JFIF и связанные данные, или никакие дочерние элементы, указывая, что поток не содержит маркера JFIF. В будущих версиях формата метаданных JPEG могут поддерживаться другие варианты метаданных JPEG (например. Exif), определяя другие типы узлов, которые могут появиться как дочерний элемент JPEGvariety узел.

(Отметьте что приложение, желающее интерпретировать метаданные Exif, поданные древовидная структура метаданных javax_imageio_jpeg_image_1.0 формат должен проверить на unknown сегмент маркера с тегом, указывающим APP1 маркер и содержащий данные, идентифицирующие это как сегмент маркера Exif. Затем это может использовать специализированный код, чтобы интерпретировать данные в сегменте маркера. Если такое приложение должно было встретиться с деревом метаданных, отформатированным согласно будущей версии формата метаданных JPEG, сегмент маркера Exif не мог бы быть unknown в том формате - это могло бы быть структурировано как дочерний узел JPEGvariety узел. Таким образом для приложения важно определить который версия использовать, передавая строку, идентифицирующую версию для метода/конструктора, используемого, чтобы получить IIOMetadata объект.)

На чтении, JFXX и app2ICC узлы происходят как дочерние элементы app0JFIF узел. Это - истина независимо от где JFXX APP0 и APP2 сегменты маркера фактически происходят в потоке. Упорядочивание узлов в пределах markerSequence узел соответствует упорядочиванию сегментов маркера, найденных в потоке JPEG.

На записи, любом JFXX и app2ICC узлы должны произойти как дочерние элементы app0JFIF узел, непосредственно дочерний элемент a JPEGvariety узел, который должен всегда быть первым узлом. (Если поток не должен быть JFIF совместимый, нет app0JFIF узел должен быть обеспечен, и JPEGvariety у узла не должно быть никаких дочерних элементов.) Любой JFIF APP0, JFXX APP0, и APP2 сегменты маркера пишутся сначала, сопровождаются всем Adobe APP14, APPn, COM и неизвестные сегменты в порядке, в котором их соответствующие узлы появляются в markerSequence узел, сопровождаемый DQTDHT для непрогрессивных записей) сегменты маркера, сопровождаемые SOF и SOS сегменты маркера. Для прогрессивных записей, используя метаданные, чтобы управлять прогрессией, SOS сегменты используются в порядке, в котором их соответствующие узлы происходят в markerSequence узел.

reset, mergeTree и setFromTree у операций есть следующая семантика для объекта метаданных плагина JPEG:

reset - Звонок reset восстановит объект метаданных к тому же самому состоянию, которое он сразу имел после создания, появлялось ли это от чтения потока или получая объект значения по умолчанию из ImageWriter. Это - истина независимо от того, сколько времен объект метаданных был изменен начиная с создания.

mergeTree - Собственный Формат
mergeTree работа принимает допустимые деревья, соответствующие DTD ниже, и объединяет узлы, используя следующие правила упорядочивания. Во всех случаях только данные, существующие в новом узле, изменяются в соответствующем существующем узле, если любой. Это означает, что узлы не могут быть удалены, используя mergeTree. Чтобы удалить узлы, использовать setFromTree. Дерево должно состоять из IIOMetadataNodes.

mergeTree - Стандартный Формат
mergeTree работа, когда дано дерево в стандартном формате, изменит собственное дерево следующими способами:

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

setFromTree - Стандартный Формат
setFromTree работа, когда дано дерево в стандартном формате, выполняет a reset сопровождаемый слиянием нового дерева.

DTD Метаданных изображения

<!DOCTYPE "javax_imageio_jpeg_image_1.0" [

  <!ELEMENT "javax_imageio_jpeg_image_1.0" (JPEGvariety, markerSequence)>

    <!ELEMENT "JPEGvariety" (app0JFIF)>
      <!-- A node grouping all marker segments specific to the variety of
              stream being read/written (e.g. JFIF) - may be empty --> 

      <!ELEMENT "app0JFIF" (JFXX?, app2ICC?)>
        <!ATTLIST "app0JFIF" "majorVersion" #CDATA "1">
          <!-- The major JFIF version number --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->
        <!ATTLIST "app0JFIF" "minorVersion" #CDATA "2">
          <!-- The minor JFIF version number --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->
        <!ATTLIST "app0JFIF" "resUnits" ("0" | "1" | "2") "0">
          <!-- The resolution units for Xdensisty and Ydensity (0 = no 
               units, just aspect ratio; 1 = dots/inch; 2 = dots/cm) --> 
        <!ATTLIST "app0JFIF" "Xdensity" #CDATA "1">
          <!-- The horizontal density or aspect ratio numerator --> 
          <!-- Data type: Integer -->
          <!-- Min value: 1 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "app0JFIF" "Ydensity" #CDATA "1">
          <!-- The vertical density or aspect ratio denominator --> 
          <!-- Data type: Integer -->
          <!-- Min value: 1 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "app0JFIF" "thumbWidth" #CDATA "0">
          <!-- The width of the thumbnail, or 0 if there isn't one --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->
        <!ATTLIST "app0JFIF" "thumbHeight" #CDATA "0">
          <!-- The height of the thumbnail, or 0 if there isn't one --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->

        <!ELEMENT "JFXX" (app0JFXX)*>
          <!-- Min children: 1 -->

        <!ELEMENT "app0JFXX" (JFIFthumbJPEG | JFIFthumbPalette | 
          JFIFthumbRGB)>
          <!-- A JFIF extension marker segment --> 
          <!ATTLIST "app0JFXX" "extensionCode" ("16" | "17" | "19")
             #IMPLIED>
            <!-- The JFXX extension code identifying thumbnail type: (16 = 
                 JPEG, 17 = indexed, 19 = RGB --> 

          <!ELEMENT "JFIFthumbJPEG" (markerSequence?)>
            <!-- A JFIF thumbnail in JPEG format (no JFIF segments 
                 permitted) --> 

          <!ELEMENT "JFIFthumbPalette" EMPTY>
            <!-- A JFIF thumbnail as an RGB indexed image --> 
            <!ATTLIST "JFIFthumbPalette" "thumbWidth" #CDATA #IMPLIED>
              <!-- The width of the thumbnail --> 
              <!-- Data type: Integer -->
              <!-- Min value: 0 (inclusive) -->
              <!-- Max value: 255 (inclusive) -->
            <!ATTLIST "JFIFthumbPalette" "thumbHeight" #CDATA #IMPLIED>
              <!-- The height of the thumbnail --> 
              <!-- Data type: Integer -->
              <!-- Min value: 0 (inclusive) -->
              <!-- Max value: 255 (inclusive) -->

          <!ELEMENT "JFIFthumbRGB" EMPTY>
            <!-- A JFIF thumbnail as an RGB image --> 
            <!ATTLIST "JFIFthumbRGB" "thumbWidth" #CDATA #IMPLIED>
              <!-- The width of the thumbnail --> 
              <!-- Data type: Integer -->
              <!-- Min value: 0 (inclusive) -->
              <!-- Max value: 255 (inclusive) -->
            <!ATTLIST "JFIFthumbRGB" "thumbHeight" #CDATA #IMPLIED>
              <!-- The height of the thumbnail --> 
              <!-- Data type: Integer -->
              <!-- Min value: 0 (inclusive) -->
              <!-- Max value: 255 (inclusive) -->

        <!ELEMENT "app2ICC" EMPTY>
          <!-- An ICC profile APP2 marker segment --> 
          <!-- Optional User object: java.awt.color.ICC_Profile -->

    <!ELEMENT "markerSequence" (dqt | dht | dri | com | unknown | 
      app14Adobe | sof | sos)*>
      <!-- A node grouping all non-jfif marker segments --> 

      <!ELEMENT "dqt" (dqtable)*>
        <!-- A Define Quantization Table(s) marker segment --> 
        <!-- Min children: 1 -->
        <!-- Max children: 4 -->

        <!ELEMENT "dqtable" EMPTY>
          <!-- A single quantization table --> 
          <!-- User object: javax.imageio.plugins.jpeg.JPEGQTable -->
          <!ATTLIST "dqtable" "elementPrecision" #CDATA "0">
            <!-- The number of bits in each table element (0 = 8, 1 = 16) 
                 --> 
            <!-- Data type: Integer -->
          <!ATTLIST "dqtable" "qtableId" ("0" | "1" | "2" | "3") #REQUIRED>

      <!ELEMENT "dht" (dhtable)*>
        <!-- A Define Huffman Table(s) marker segment --> 
        <!-- Min children: 1 -->
        <!-- Max children: 4 -->

        <!ELEMENT "dhtable" EMPTY>
          <!-- A single Huffman table --> 
          <!-- User object: javax.imageio.plugins.jpeg.JPEGHuffmanTable -->
          <!ATTLIST "dhtable" "class" ("0" | "1") #REQUIRED>
            <!-- Indicates whether this is a DC (0) or an AC (1) table --> 
          <!ATTLIST "dhtable" "htableId" ("0" | "1" | "2" | "3") #REQUIRED>
            <!-- The table id --> 

      <!ELEMENT "dri" EMPTY>
        <!-- A Define Restart Interval marker segment --> 
        <!ATTLIST "dri" "interval" #CDATA #REQUIRED>
          <!-- The restart interval in MCUs --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->

      <!ELEMENT "com" EMPTY>
        <!-- A Comment marker segment. The user object contains the actual 
             bytes. --> 
        <!-- User object: array of [B -->
        <!-- Min length: 1 -->
        <!-- Max length: 65533 -->
        <!ATTLIST "com" "comment" #CDATA #IMPLIED>
          <!-- The comment as a string (used only if user object is null) 
               --> 
          <!-- Data type: String -->

      <!ELEMENT "unknown" EMPTY>
        <!-- An unrecognized marker segment. The user object contains the 
             data not including length. --> 
        <!-- User object: array of [B -->
        <!-- Min length: 1 -->
        <!-- Max length: 65533 -->
        <!ATTLIST "unknown" "MarkerTag" #CDATA #REQUIRED>
          <!-- The tag identifying this marker segment --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->

      <!ELEMENT "app14Adobe" EMPTY>
        <!-- An Adobe APP14 marker segment --> 
        <!ATTLIST "app14Adobe" "version" #CDATA "100">
          <!-- The version of Adobe APP14 marker segment --> 
          <!-- Data type: Integer -->
          <!-- Min value: 100 (inclusive) -->
          <!-- Max value: 255 (inclusive) -->
        <!ATTLIST "app14Adobe" "flags0" #CDATA "0">
          <!-- The flags0 variable of an APP14 marker segment --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "app14Adobe" "flags1" #CDATA "0">
          <!-- The flags1 variable of an APP14 marker segment --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "app14Adobe" "transform" ("0" | "1" | "2") #REQUIRED>
          <!-- The color transform applied to the image (0 = Unknown, 1 = 
               YCbCr, 2 = YCCK) --> 

      <!ELEMENT "sof" (componentSpec)*>
        <!-- A Start Of Frame marker segment --> 
        <!-- Min children: 1 -->
        <!-- Max children: 4 -->
        <!ATTLIST "sof" "process" ("0" | "1" | "2") #IMPLIED>
          <!-- The JPEG process (0 = Baseline sequential, 1 = Extended 
               sequential, 2 = Progressive) --> 
        <!ATTLIST "sof" "samplePrecision" #CDATA "8">
          <!-- The number of bits per sample --> 
          <!-- Data type: Integer -->
        <!ATTLIST "sof" "numLines" #CDATA #IMPLIED>
          <!-- The number of lines in the image --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "sof" "samplesPerLine" #CDATA #IMPLIED>
          <!-- The number of samples per line --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 65535 (inclusive) -->
        <!ATTLIST "sof" "numFrameComponents" ("1" | "2" | "3" | "4")
           #IMPLIED>
          <!-- The number of components in the image --> 

        <!ELEMENT "componentSpec" EMPTY>
          <!-- A component specification for a frame --> 
          <!ATTLIST "componentSpec" "componentId" #CDATA #REQUIRED>
            <!-- The id for this component --> 
            <!-- Data type: Integer -->
            <!-- Min value: 0 (inclusive) -->
            <!-- Max value: 255 (inclusive) -->
          <!ATTLIST "componentSpec" "HsamplingFactor" #CDATA #REQUIRED>
            <!-- The horizontal sampling factor for this component --> 
            <!-- Data type: Integer -->
            <!-- Min value: 1 (inclusive) -->
            <!-- Max value: 255 (inclusive) -->
          <!ATTLIST "componentSpec" "VsamplingFactor" #CDATA #REQUIRED>
            <!-- The vertical sampling factor for this component --> 
            <!-- Data type: Integer -->
            <!-- Min value: 1 (inclusive) -->
            <!-- Max value: 255 (inclusive) -->
          <!ATTLIST "componentSpec" "QtableSelector" ("0" | "1" | "2" | 
            "3") #REQUIRED>
            <!-- The quantization table to use for this component --> 

      <!ELEMENT "sos" (scanComponentSpec)*>
        <!-- A Start Of Scan marker segment --> 
        <!-- Min children: 1 -->
        <!-- Max children: 4 -->
        <!ATTLIST "sos" "numScanComponents" ("1" | "2" | "3" | "4")
           #REQUIRED>
          <!-- The number of components in the scan --> 
        <!ATTLIST "sos" "startSpectralSelection" #CDATA "0">
          <!-- The first spectral band included in this scan --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 63 (inclusive) -->
        <!ATTLIST "sos" "endSpectralSelection" #CDATA "63">
          <!-- The last spectral band included in this scan --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 63 (inclusive) -->
        <!ATTLIST "sos" "approxHigh" #CDATA "0">
          <!-- The highest bit position included in this scan --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 15 (inclusive) -->
        <!ATTLIST "sos" "approxLow" #CDATA "0">
          <!-- The lowest bit position included in this scan --> 
          <!-- Data type: Integer -->
          <!-- Min value: 0 (inclusive) -->
          <!-- Max value: 15 (inclusive) -->

        <!ELEMENT "scanComponentSpec" EMPTY>
          <!-- A component specification for a scan --> 
          <!ATTLIST "scanComponentSpec" "componentSelector" #CDATA
             #REQUIRED>
            <!-- The id of this component --> 
            <!-- Data type: Integer -->
            <!-- Min value: 0 (inclusive) -->
            <!-- Max value: 255 (inclusive) -->
          <!ATTLIST "scanComponentSpec" "dcHuffTable" ("0" | "1" | "2" | 
            "3") #REQUIRED>
            <!-- The huffman table to use for encoding DC coefficients --> 
          <!ATTLIST "scanComponentSpec" "acHuffTable" ("0" | "1" | "2" | 
            "3") #REQUIRED>
            <!-- The huffman table to use for encoding AC coefficients --> 
]>

Потоковый DTD Метаданных

<!DOCTYPE "javax_imageio_jpeg_stream_1.0" [
  <!ELEMENT "javax_imageio_jpeg_stream_1.0" (dqt |
                      dht | 
                      dri | 
                      com | 
                      unknown)*>
   
  <!-- All elements are as defined above for image metadata -->
]>