|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Метаданные JPEG
Сокращенные Потоки
Источники Таблиц
Преобразования Colorspace и Стандартные Маркеры
Изображения миниатюры
Прогрессивное Кодирование
Собственная Древовидная структура Формата Метаданных и Редактирование
DTD Метаданных изображения
Потоковый DTD Метаданных
dispose() на читателе JPEG и объекты писателя, когда они больше не необходимы, поскольку они используют существенные собственные ресурсы, которые не соответственно восстанавливаются сборкой "мусора". И вызов читателя и писателя dispose() в их финализаторах, но тех финализаторах, возможно, не вызывается прежде, чем собственный код исчерпал собственную память.
Писатель 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 то, когда ввод будет установлен на читателе, потоковые метаданные не будут доступны, но отобразят метаданные, будет.
IllegalArgumentException бросается.Отметьте, что, как только изображение только для таблиц было считано, это - содержание, доступно как потоковые метаданные от читателя, пока или другое изображение только для таблиц не читается из другого потока или читателя, сбрасывается. Изменение ввода не сбрасывает потоковые метаданные. Это полезно для чтения таблиц из одного файла, затем изменяя ввод, чтобы считать сокращенный поток, содержащий последовательность изображений. Таблицы будут использоваться автоматически, и останутся доступными как "потоковые" метаданные.
Сокращенные потоки пишутся, используя методы последовательности ImageWriter. Потоковые метаданные используются, чтобы записать изображение только для таблиц в начале потока, и таблицы устанавливаются для использования, используя ImageWriter.prepareWriteSequence. Если никакие потоковые метаданные не предоставляются ImageWriter.prepareWriteSequence, тогда никакое изображение только для таблиц не пишется. Если потоковые метаданные, не содержащие таблиц, предоставляются ImageWriter.prepareWriteSequence, тогда изображение только для таблиц, содержащее значение по умолчанию визуально таблицы без потерь, пишется.
Изображения пишутся с таблицами, если таблицы присутствуют в своих объектах метаданных или без них, если никакие таблицы не присутствуют в своих объектах метаданных. Если никакой объект метаданных не присутствует тогда, таблицы пишутся. Таблицы, используемые для сжатия, берутся из одного из следующих источников, с которыми консультируются в порядке:
ImageWriteParam и режим сжатия устанавливается в EXPLICIT, созданное использование таблиц значения по умолчанию качественной установки используется. Они пишутся, только если метаданные содержат таблицы или если нет никаких метаданных, но они заменяют таблицы в метаданных.ImageWriteParam и режим сжатия устанавливается в DEFAULT, примите значение по умолчанию визуально lossles, таблицы используются. Они пишутся, только если метаданные содержат таблицы или если нет никаких метаданных, но они заменяют таблицы в метаданных.ImageWriteParam должен быть MODE_COPY_FROM_METADATA, когда следующее используется: JPEGImageWriteParam, если существующийJPEGImageWriteParams только как средство определения таблиц, когда никакой другой источник не доступен, и это может произойти только при записи в сокращенный поток без таблиц, используя известные нестандартные таблицы для сжатия. Читая, таблицы в a JPEGImageReadParam консультируются, только если на столы не накрыло никакое предыдущее чтение. На столы накрывают от a JPEGImageReadParam переопределяются любыми таблицами, существующими в считанном потоке.
Отметьте, что, если никакой объект метаданных изображения не определяется для определенного изображения, объект значения по умолчанию используется, который включает таблицы значения по умолчанию.
Rasters читаются, никакое colorspace преобразование не выполняется, и любой целевой тип игнорируется. Предупреждение отправляется любым слушателям, если целевой тип определяется в этом случае. Когда Rasters пишутся, любой целевой тип используется, чтобы интерпретировать полосы. Это могло бы привести к JFIF или заголовку Adobe, записанному, или различные компонентные идентификаторы, записанные фрейму, и отсканировать заголовки. Если значения, существующие в объекте метаданных, не соответствуют целевой тип, целевой тип используется, и предупреждение отправляется любым слушателям. Дополнительная поддержка ColorSpace: Обрабатывая PhotoYCC (YCC), PhotoYCCA (YCCA), цветовые пространства RGBA и YCbCrA стандартным плагином, как описано ниже, зависят от возможностей библиотек, пользовавшихся, чтобы интерпретировать данные JPEG. Таким образом все последовательные поведения являются дополнительными. Если поддержка не будет доступна, декодируя, то цветовое пространство будет обработано как нераспознанное, и соответствующее пространство цвета по умолчанию для конкретного количества компонентных каналов может быть использовано. При записи Исключение может быть выдано, если никакое подходящее преобразование не может быть применено перед кодированием. Но где поддержка этих цветовых пространств доступна, поведение должно быть как задокументировано.
Читая, содержание потока интерпретируется обычными соглашениями JPEG, следующим образом:
APP0 сегмент маркера присутствует, colorspace, как известно, является или шкалой полутонов или YCbCr. Если APP2 сегмент маркера, содержащий встроенный профиль ICC, также присутствует, тогда YCbCr преобразовывается в RGB согласно формулам, данным в спецификации JFIF, и профиль ICC, как предполагается, обращается к получающемуся пространству RGB.
APP14 сегмент маркера присутствует, colorspace определяется, консультируясь transform флаг. transform флаг принимает одно из трех значений:
RGB
RGBA
YCC (как 'Y', 'C', 'c'), предполагаемый быть PhotoYCC
YCCA (как 'Y', 'C', 'c',), предполагаемый быть PhotoYCCA
Иначе, подвыбранными изображениями с 3 каналами, как предполагается, является YCbCr! неподвыбранные изображения с 3 каналами, как предполагается, являются RGB, подвыбранные изображения с 4 каналами, как предполагается, являются YCCK, и! неподвыбранные изображения с 4 каналами, как предполагается, являются CMYK.
BufferedImage. Такое изображение может быть только для чтения как a Raster. Если изображение является поддающимся толкованию, но нет никакого Java ColorSpace доступное соответствие закодированному colorspace (ImageReader.getRawImageType возвратится null. ColorSpace или пользовательский RGB ColorSpace основанный на объектах на встроенном профиле ICC используется, чтобы создать вывод ColorModel. PhotoYCC и изображения PhotoYCCA не преобразовываются. CMYK и изображения YCCK в настоящий момент не поддерживаются.BufferedImage (Rasters. Если изображение colorspace неподдерживается или неподдающееся толкованию, то ImageReader.getImageTypes возвратит пустое Iterator. Если подмножество необработанных полос требуется, a Raster должен быть получен сначала и полосы, полученные из этого. Для того, чтобы записать, цветное преобразование, чтобы применяться определяется следующим образом:
Если подмножество исходных полос должно быть записано, никакое цветное преобразование не выполняется. Любое место назначения, если установлено, должно соответствовать число полос, которые будут записаны, и служат интерпретацией выбранных полос, а не запросом преобразования. Это поведение идентично этому для Rasters. Если все полосы должны быть записаны и изображение (в противоположность a Raster) пишется, любой целевой тип игнорируется, и предупреждение отправляется любым слушателям.
Если целевой тип используется и аспект объекта метаданных, если есть один, не является совместимым с тем типом, целевой тип используется, записанные метаданные изменяются от этого, если, и предупреждение отправляется слушателям. Это включает app0JFIF и app14Adobe узлы. Компонентные идентификаторы в sof и sos узлы не изменяются, однако, как если a app0JFIF узел присутствует, любые значения могут использоваться.
Когда полное изображение будет записано, место назначения colorspace будет выбрано основанное на содержании изображения и настройках метаданных согласно следующему алгоритму:
Если никакой объект метаданных не определяется, то следующие значения по умолчанию применяются:
APP0 сегмент маркера. Полутоновые изображения с альфой пишутся без специального маркера. Как требуется JFIF, компонентные идентификаторы во фрейме и заголовке сканирования устанавливаются в 1. APP0 сегмент маркера. Если ColorSpace из изображения основано на ICCProfile (это - экземпляр ICC_ColorSpace, но не один из встроенного стандарта ColorSpaces), тогда тот профиль встраивается в APP2 сегмент маркера. Как требуется JFIF, компонентные идентификаторы во фрейме и заголовках сканирования устанавливаются в 1, 2, и 3. APP14 сегмент маркера и 'Y', 'C', и 'c' (и, если альфа-канал присутствует) как компонентные идентификаторы во фрейме и заголовках сканирования. Если объект метаданных определяется, то число каналов во фрейме и заголовках сканирования должно всегда соответствовать число полос, которые будут записаны, или исключение выдается. app0JFIF и app14Adobe узлы могут появиться в том же самом объекте метаданных только если app14Adobe узел указывает на YCbCr, и компонентные идентификаторы JFIF совместимый (0-2). Различные типы изображения обрабатываются следующими способами:
(Все многоканальные изображения подвыбираются согласно факторам выборки в узле заголовка фрейма объекта метаданных, независимо от цветового пространства.)
app0JFIF узел присутствует в объекте метаданных, JFIF APP0 сегмент маркера пишется. app14Adobe узел присутствует в объекте метаданных, он проверяется на законность (transform должен быть UNKNOWN) и записанный. app0JFIF узел присутствует в объекте метаданных, он игнорируется, и предупреждение отправляется слушателям, поскольку JFIF не поддерживает изображения с 2 каналами. app14Adobe узел присутствует в объекте метаданных, он проверяется на законность (transform должен быть UNKNOWN) и записанный. Если transform не UNKNOWN, предупреждение отправляется слушателям, и корректное преобразование пишется. app0JFIF узел присутствует в объекте метаданных, изображение преобразовывается в YCbCr и пишется с JFIF APP0 сегмент маркера. Если ColorSpace из изображения основано на нестандартном Профиле ICC, тогда тот профиль встраивается в APP2 сегмент маркера. Если ColorSpace не основано на нестандартном Профиле ICC, но app2ICC узел появляется в метаданных, затем APP2 сегмент маркера пишется с соответствующим стандартным профилем. Отметьте, что профиль должен определить цветовое пространство RGB, поскольку файл должен быть JFIF совместимый. app14Adobe узел присутствует в объекте метаданных, изображение преобразовывается согласно цветной установке преобразования и пишется с Adobe APP14 сегмент маркера. Компонентные идентификаторы пишутся так же, как они появляются во фрейме и сканируют заголовки. Цветным преобразованием должен быть или YCbCr или UNKNOWN. Если это UNKNOWN, изображение не является преобразованным цветом. app0JFIF узел присутствует в объекте метаданных, он игнорируется, и предупреждение отправляется слушателям, поскольку JFIF не поддерживает изображения с 4 каналами. app14Adobe узел присутствует в объекте метаданных, изображение пишется с Adobe APP14 сегмент маркера. Никакое colorspace преобразование не выполняется. Компонентные идентификаторы пишутся так же, как они появляются во фрейме и сканируют заголовки. Цветное преобразование должно быть UNKNOWN. Если это не, предупреждение отправляется слушателям. app14Adobe узел присутствует, с компонентными идентификаторами в заголовке фрейма консультируются. Если они указывают на colorspace как описано выше, то изображение преобразовывается в это colorspace если возможный. Если компонентные идентификаторы не указывают на colorspace, то с факторами выборки консультируются. Если изображение должно быть подвыбрано, оно преобразовывается в YCbCrA. Если изображение не должно быть подвыбрано, то никакое преобразование не применяется. Никакие специальные сегменты маркера не пишутся. app0JFIF узел присутствует в объекте метаданных, изображение преобразовывается в sRGB, и затем в YCbCr во время кодирования, и JFIF APP0 сегмент маркера пишется. app14Adobe узел присутствует в объекте метаданных, никакое преобразование не применяется, и Adobe APP14 сегмент маркера пишется. Цветное преобразование должно быть YCC. Если это не, предупреждение отправляется слушателям. app0JFIF узел присутствует в объекте метаданных, он игнорируется, и предупреждение отправляется слушателям, поскольку JFIF не поддерживает изображения с 4 каналами. app14Adobe узел присутствует в объекте метаданных, никакое преобразование не применяется, и Adobe APP14 сегмент маркера пишется. Цветное преобразование должно быть UNKNOWN. Если это не, предупреждение отправляется слушателям.
app0JFIF и app0JFXX узлы, существующие в метаданных, не содержат пиксельных данных миниатюры. Однако, виды записанных миниатюр зависят от содержания объекта метаданных, следующим образом. Любая миниатюра, которая должна быть записана как индексированный или изображение RGB и которая больше чем 255 255, будет отсечена, не масштабироваться, к 255 255. Миниатюры, записанные как изображения JPEG, могут быть любым размером. Предупреждение отправляется любым слушателям всякий раз, когда миниатюра отсекается. app0JFXX узел присутствует в метаданных, или первом app0JFXX узел, существующий в метаданных, содержит a JFIFthumbPalette элемент, миниатюра палитры пишется в JFXX APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит другую форму миниатюры (RGB или JPEG), изображение палитры расширяется до RGB, и обозначенная форма миниатюры пишется. app0JFXX узел присутствует в метаданных, миниатюра пишется как часть JFIF APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbRGB элемент, миниатюра RGB пишется в JFXX APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbJPEG элемент, миниатюра JPEG пишется в JFXX APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbPalette элемент, миниатюра RGB пишется в JFXX APP0 сегмент маркера и предупреждение отправляются любым слушателям. app0JFXX узел присутствует в метаданных, миниатюра расширяется до RGB и пишется как часть JFIF APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbRGB элемент, миниатюра расширяется до RGB и пишется в отдельном JFXX Сегмент маркера RGB. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbJPEG элемент, миниатюра JPEG пишется в JFXX APP0 сегмент маркера. app0JFXX узел, существующий в метаданных, содержит a JFIFthumbPalette элемент, миниатюра JPEG пишется в JFXX APP0 сегмент маркера и предупреждение отправляются любым слушателям. APP0 сегмент, и app0JFXX узел, с которым консультируются для каждой миниатюры, app0JFXX узел от метаданных, которые происходят в той же самой последовательности как миниатюра. app0JFXX узел применяется к первой миниатюре, второму узлу к второй миниатюре, и так далее. Если есть меньше app0JFXX узлы в метаданных чем миниатюры, тогда у тех миниатюр, как полагают, нет никакого соответствия app0JFXX узел. Миниатюра RGB без соответствия app0JFXX узел пишется в JFXX APP0 сегмент маркера. Полутоновая миниатюра без соответствия app0JFXX узел пишется как изображение JPEG JFXX APP0 сегмент маркера. Отметьте, что, поскольку единственный механизм для того, чтобы сохранить миниатюры через JFIF или сегменты маркера расширения JFIF, только у шкалы полутонов или изображений RGB могут быть миниатюры. Если миниатюры присутствуют при записи какого-либо другого типа изображения, миниатюры игнорируются, и предупреждение отправляется любым слушателям предупреждения.
ImageWriteParam переданный в к операции записи, или изображению будет записан последовательно, независимо от заголовков сканирования, включенных в объект метаданных. Если прогрессивное кодирование включается и устанавливается скопировать с метаданных, то последовательность заголовков сканирования от метаданных используется, чтобы записать изображение. Если прогрессивное кодирование включается и устанавливается использовать значение по умолчанию, то сканирования в метаданных игнорируются, и набор значения по умолчанию сканирований используется. Прогрессивное кодирование всегда вызывает, оптимизировал таблицы Хафмана, которые будут использоваться. Любые таблицы Хаффмана, существующие в метаданных, будут проигнорированы, и предупреждение будет отправлено любым слушателям предупреждения. Если оптимизацию Таблицы Хаффмана требуют на ImageWriteParam, все таблицы Хафмана в метаданных или в ImageWriteParam непосредственно игнорируются, и предупреждение будет отправлено любым слушателям предупреждения, если какие-либо такие таблицы будут присутствовать.
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 узел, сопровождаемый DQT (и DHT для непрогрессивных записей) сегменты маркера, сопровождаемые SOF и SOS сегменты маркера. Для прогрессивных записей, используя метаданные, чтобы управлять прогрессией, SOS сегменты используются в порядке, в котором их соответствующие узлы происходят в markerSequence узел.
reset, mergeTree и setFromTree у операций есть следующая семантика для объекта метаданных плагина JPEG:
reset - Звонок reset восстановит объект метаданных к тому же самому состоянию, которое он сразу имел после создания, появлялось ли это от чтения потока или получая объект значения по умолчанию из ImageWriter. Это - истина независимо от того, сколько времен объект метаданных был изменен начиная с создания.
mergeTree - Собственный Формат
mergeTree работа принимает допустимые деревья, соответствующие DTD ниже, и объединяет узлы, используя следующие правила упорядочивания. Во всех случаях только данные, существующие в новом узле, изменяются в соответствующем существующем узле, если любой. Это означает, что узлы не могут быть удалены, используя mergeTree. Чтобы удалить узлы, использовать setFromTree. Дерево должно состоять из IIOMetadataNodes.
app0JFIF
app0JFIF узел уже существует, содержание нового изменяет существующий. dqt
dqt узлы в последовательности, тогда каждая таблица в узле заменяет первую таблицу в любом dqt узел, с тем же самым табличным идентификатором. dqt узлы содержат таблицу с тем же самым идентификатором, тогда таблица добавляется к последнему существующему dqt узел. dqt узлы, затем новый создается и добавляется следующим образом: dht узлы, новое dqt узел вставляется перед первым. dht узлы, новое dqt узел вставляется перед sof узел, если есть тот. sof узел, новое dqt узел вставляется перед первым sos узел, если есть тот. sos узел, новое dqt узел добавляется до конца последовательности. dht
dht узлы в последовательности, тогда каждая таблица в узле заменяет первую таблицу в любом dht узел, с той же самой таблицей class и табличный идентификатор. dht узлы содержат таблицу с тем же самым class и идентификатором, тогда таблица добавляется к последнему существующему dht узел. dht узлы, затем новый создается и добавляется следующим образом: dqt узлы, новое dht узел сразу вставляется после последнего dqt узел. dqt узлы, новое dht узел вставляется перед sof узел, если есть тот. sof узел, новое dht узел вставляется перед первым sos узел, если есть тот. sos узел, новое dht узел добавляется до конца последовательности. dri
dri узел, значение интервала перезапуска обновляется. dri узел, затем новый создается и добавляется следующим образом: sof узел, новое dri узел вставляется перед этим. sof узел, новое dri узел вставляется перед первым sos узел, если есть тот. sos узел, новое dri узел добавляется до конца последовательности. com
com узел создается и вставляется следующим образом: com узлы, новый вставляется после последнего. com узлы, новое com узел вставляется после app14Adobe узел, если есть тот. app14Adobe узел, новое com узел вставляется в начале последовательности. app14Adobe
app14Adobe узел, тогда его атрибуты обновляются от узла. app14Adobe узел, затем новый создается и добавляется следующим образом: app14Adobe узел вставляется после последнего unknown узел, если есть кто-либо. unknown узлы, новое app14Adobe узел вставляется в начале последовательности. unknown
unknown узел создается и добавляется к последовательности следующим образом: unknown узлы маркера, новый вставляется после последнего. unknown узлы, новое unknown узел вставляется перед app14Adobe узел, если есть тот. app14Adobe узел, новое unknown узел вставляется в начале последовательности. sof
sof узел в последовательности, тогда ее значения обновляются от узла. sof узел, затем новый создается и добавляется следующим образом: sos узлы, новое sof узел вставляется перед первым. sos узел, новое sof узел добавляется до конца последовательности. sos
sos узел, тогда значения обновляются от узла. sos узлы, затем IIOInvalidTreeException бросается, как sos узлы не могут быть объединены в ряд прогрессивных сканирований. sos узлы, новый создается и добавляется до конца последовательности. mergeTree - Стандартный Формат
mergeTree работа, когда дано дерево в стандартном формате, изменит собственное дерево следующими способами:
Chroma - ColorSpaceType подузел a Chroma узел может изменить цель colorspace сжатого изображения. Выбор нового colorspace может вызвать много изменений, в соответствии с алгоритмами, описанными выше: app0JFIF и app14Adobe узлы могут быть добавлены или удалены, подвыборка может быть добавлена или удалена, компонентные идентификаторы могут быть изменены, и sof и sos узлы будут обновлены соответственно. В случае необходимости дополнительное квантование и таблицы Хаффмана добавляются. В случае таблиц квантования значение по умолчанию будет масштабироваться, чтобы соответствовать уровень качества любых существующих таблиц. Никакие таблицы не добавляются к метаданным, которые уже не содержат таблицы. Если существующие метаданные определяют прогрессивное кодирование, то число каналов не должно измениться. Любой Transparency узел также принимается во внимание как явное значение none для Alpha подузел может вызвать удаление альфа-канала, и чего-либо кроме none может вызвать добавление альфа-канала. Dimension - A PixelAspectRatio спецификация может вызвать содержание app0JFIF узел, чтобы измениться, если есть одно существующее, или добавление app0JFIF узел, содержащий соответствующие значения, если может быть тот. Соответствующая пара целых чисел вычисляется от отношения с плавающей точкой для включения в узел. Text - Каждый несжатый текстовый элемент преобразовывается в a com узел и вставленный согласно правилам выше для того, чтобы объединиться com узлы. setFromTree - Собственный Формат
setFromTree работа, когда дано дерево в собственном формате, описанном ниже, просто заменит существующее дерево полностью новым. Дерево должно состоять из IIOMetadataNodes.
setFromTree - Стандартный Формат
setFromTree работа, когда дано дерево в стандартном формате, выполняет a reset сопровождаемый слиянием нового дерева.
<!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 -->
]>
<!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 -->
]>