JPEGメタデータ
省略されたストリーム
表のソース
カラー・スペースの変換と一般的なマーカー
サムネール・イメージ
プログレッシブ・エンコーディング
ネイティブ・メタデータ形式のツリー構造と編集
イメージ・メタデータDTD
ストリーム・メタデータDTD
dispose()
を呼び出すことが重要です。リーダーとライターはどちらもファイナライザでdispose()
を呼び出しますが、ネイティブ・コードによってネイティブ・メモリーがなくなるまで、これらのファイナライザを呼び出すことはできません。
JPEGライターはピクセルの置換えをサポートしていません。
SOI
マーカーとEOI
マーカー間にあるマーカー・セグメントの内容が記述されます。書込みに渡されるイメージ・メタデータ・オブジェクトは、そのイメージのSOI
マーカーとEOI
マーカー間にあるストリームの内容を指定し、ImageWriteParam
内のコントロールに従います。
ストリーム・メタデータは、省略されたイメージを含むストリームの先頭にある(または配置される)表専用イメージにのみ使用されます。表専用イメージはイメージとして扱われず、イメージ・インデックスを使用しません。ストリームの先頭に表専用イメージがある場合、読込みで返されるストリーム・メタデータ・オブジェクトには、その単一のイメージのSOI
マーカーとEOI
マーカー間にあるマーカー・セグメントの内容が記述されます。ストリームの先頭に表専用イメージがない場合、ImageReader
のgetStreamMetadata
メソッドはnull
を返します。ストリーム・メタデータがライターに提供されると、ストリーム・メタデータ・オブジェクトの表を含む単一の表専用イメージがストリームの先頭に書き込まれます。ストリーム・メタデータ・オブジェクトに表が含まれていない場合は、デフォルトの表が書き込まれます。ストリーム・メタデータの唯一の目的は省略されたストリームの先頭にある表専用イメージを指定することであり、ストリーム・メタデータ引数はImageWriter.prepareWriteSequence
メソッドでのみ有効です。ほかのすべてのメソッドでは無視されます。
ImageWriter.getDefaultStreamMetadata
メソッドは、JPEGImageWriteParam
であり、かつ表を含んでいる場合、ImageWriteParam
引数の表を含むオブジェクトを返します。それ以外の場合、返されるオブジェクトにはデフォルトの表が含まれます。
ImageWriteParam
引数に表が含まれている場合、ImageWriter.getDefaultImageMetadata
メソッドは表をJPEGImageWriteParam
にのみ表を含めることができます。
ignoreMetadata
がtrue
に設定され、リーダーに入力が設定されている場合、ストリーム・メタデータは利用できませんがイメージ・メタデータは利用できます。
IllegalArgumentException
がスローされます。表専用イメージが一度読み込まれると、別のストリームから別の表専用イメージが読み込まれるかリーダーがリセットされるまで、リーダーはその内容をストリーム・メタデータとして利用できます。入力を変更してもストリーム・メタデータはリセットされません。これは、1つのファイルから表を読み込んだあと、入力を変更して一連のイメージを含む、省略されたストリームを読み込むのに便利です。表は自動的に使用され、「ストリーム」メタデータとして引き続き利用できます。
省略されたストリームはImageWriter
のシーケンス型メソッドを使用して書き込まれます。ImageWriter.prepareWriteSequence
を使用すると、ストリーム・メタデータを使用してストリームの先頭に表専用イメージを書き込み、表を使用するための設定を行うことができます。ImageWriter.prepareWriteSequence
にストリーム・メタデータが指定されていない場合、表専用イメージは書き込まれません。表を含まないストリーム・メタデータがImageWriter.prepareWriteSequence
に指定されている場合、デフォルトの視覚的に損失のない表を含む表専用イメージが書き込まれます。
メタデータ・オブジェクトに表が存在する場合、イメージは表とともに書き込まれ、メタデータ・オブジェクトに表が存在しない場合は表なしで書き込まれます。メタデータ・オブジェクトが存在しない場合は表が書き込まれます。圧縮に使用する表は、順に参照される次のソースのいずれかから取得されます。
ImageWriteParam
があり、圧縮モードがEXPLICIT
に設定されている場合、品質設定を使用して構築されたデフォルトの表が使用されます。メタデータに表が含まれる場合、またはメタデータが存在しない場合にのみ書き込まれますが、メタデータの表で置き換えられます。ImageWriteParam
があり、圧縮モードがDEFAULT
に設定されている場合、デフォルトの視覚的に損失のない表が使用されます。メタデータに表が含まれる場合、またはメタデータが存在しない場合にのみ書き込まれますが、メタデータの表で置き換えられます。ImageWriteParam
の圧縮モードがMODE_COPY_FROM_METADATA
である必要があります。この場合、次が使用されます。
JPEGImageWriteParam
内の表(存在する場合)JPEGImageWriteParam
に表を含めておく必要があるという設計目的によるものです。また、これが発生する可能性があるのは、圧縮に既知の非標準表を使用して表のない省略されたストリームに書込みを行う場合のみです。
読込み時には、前の読込みで表が設定されていない場合にのみJPEGImageReadParam
の表が参照されます。JPEGImageReadParam
から設定された表は、読み込まれるストリーム内に存在する表でオーバーライドされます。
特定のイメージに対してイメージ・メタデータ・オブジェクトが指定されていない場合は、デフォルトの表を含むデフォルトのオブジェクトが使用されます。
Raster
の読込み時には、カラー・スペースの変換は行われず、デスティネーション・タイプは無視されます。この場合、デスティネーション・タイプが指定されていると警告がリスナーに送信されます。Raster
の書込み時には、デスティネーション・タイプがバンドの解釈に使用されます。これによって、JFIFまたはAdobeヘッダーが書き込まれたり、異なるコンポーネントIDがフレームおよびスキャン・ヘッダーに書き込まれたりする場合があります。メタデータ・オブジェクト内に存在する値がデスティネーション・タイプと一致しない場合は、デスティネーション・タイプが使用され、警告がリスナーに送信されます。
オプションのColorSpaceのサポート:標準プラグインによるPhotoYCC (YCC)、PhotoYCCA (YCCA)、RGBA、およびYCbCrAカラー・スペースの処理は、次に説明するように、JPEGデータの解釈に使用するライブラリの機能によって異なります。そのため、結果として起こるすべての動作はオプションによるものです。復号化のときにサポートを利用できない場合は、カラー・スペースが未認識として扱われ、指定された数のコンポーネント・チャネルに応じたデフォルトのカラー・スペースを使用できます。書込み時に、復号化の前に適切な変換を適用できない場合はExceptionがスローされます。ただし、これらのカラー・スペースのサポートを利用できる場合、動作はドキュメント化されたとおりになります。
読込み時には、ストリームの内容は通常のJPEG規則によって次のように解釈されます。
APP0
マーカー・セグメントが存在する場合、カラー・スペースはグレー・スケールまたはYCbCrのどちらかであると認識されます。ICCプロファイルが埋め込まれたAPP2
マーカー・セグメントも存在する場合、YCbCrはJFIF規格で定められた式に従ってRGBに変換され、ICCプロファイルはその結果得られるRGB空間を参照していると見なされます。
APP14
マーカー・セグメントが存在する場合、カラー・スペースはtransform
フラグを参照して決定されます。transform
フラグは3つの値のいずれかを取ります。
RGB
RGBA
YCC (「Y」、「C」、「c」による)、PhotoYCCと見なされる
YCCA (「Y」、「C」、「c」、「A」による)、PhotoYCCAと見なされる
それ以外の場合、3チャネルのサブサンプル・イメージはYCbCrと見なされ、3チャネルの非サブサンプル・イメージはRGBと見なされ、4チャネルのサブサンプル・イメージはYCCKと見なされ、4チャネルの非サブサンプル・イメージはCMYKと見なされます。
BufferedImage
として読み込もうとすると例外がスローされます。そのようなイメージはRaster
としてのみ読み込むことができます。イメージが解釈可能でも符号化されたカラー・スペース(ColorSpace
を利用できない場合は、ImageReader.getRawImageType
がnull
を返します。
ColorSpace
またはカスタムRGB ColorSpace
オブジェクトを使用して出力ColorModel
が作成されます。PhotoYCCおよびPhotoYCCAイメージは変換されません。CMYKおよびYCCKイメージは現在サポートされていません。BufferedImage
のようなサポートされていないJPEGカラー・スペース(Raster
として読み込むことができます。イメージのカラー・スペースがサポートされていない、または解釈不可の場合は、ImageReader.getImageTypes
が空のIterator
を返します。未処理のバンドのサブセットが必要な場合、まずRaster
を取得し、そこからバンドを取得する必要があります。 書込みでは、適用されるカラー変換は次のように決定されます。
ソース・バンドのサブセットが書き込まれる場合、カラー変換は行われません。デスティネーションは(設定されている場合)、書き込まれるバンド数と一致する必要があり、変換要求ではなく選択されたバンドの解釈に使用されます。その動作はRaster
のものと同じです。すべてのバンドが書き込まれ、Raster
ではなくイメージが書き込まれる場合、デスティネーションのタイプは無視され、警告がリスナーに送信されます。
デスティネーション・タイプが使用されており、メタデータ・オブジェクトがある場合にその特性とデスティネーション・タイプに互換性がなければ、デスティネーション・タイプが使用され、書き込まれるメタデータは提供されるメタデータから変更され、警告がリスナーに送信されます。これには、app0JFIF
およびapp14Adobe
ノードが含まれます。sof
およびsos
ノード内のコンポーネントIDは変更されませんが、app0JFIF
ノードが存在しないかぎり、あらゆる値を使用できます。
イメージ全体を書き込む場合、デスティネーションのカラー・スペースはイメージの内容およびメタデータの設定に基づき、次のアルゴリズムに従って選択されます。
メタデータ・オブジェクトが指定されていない場合は、次のデフォルトが適用されます。
APP0
マーカー・セグメントとともに書き込まれます。アルファ付きグレー・スケール・イメージは、特殊なマーカーなしで書き込まれます。JFIFの要件に応じて、フレーム内のコンポーネントIDおよびスキャン・ヘッダーは1に設定されます。
APP0
マーカー・セグメントとともに書き込まれます。イメージのColorSpace
がICCProfile
(ICC_ColorSpace
のインスタンス、ただし標準の組み込みColorSpaces
の1つではありません)に基づいている場合、そのプロファイルはAPP2
マーカー・セグメントに埋め込まれます。JFIFの要件に応じて、フレーム内のコンポーネントIDおよびスキャン・ヘッダーは1、2、および3に設定されます。
APP14
マーカー・セグメント、およびフレームとスキャン・ヘッダー内のコンポーネントIDとして「Y」、「C」、および「c」(アルファ・チャネルが存在する場合はさらに「A」)とともに書き込まれます。
メタデータ・オブジェクトが指定されている場合、フレームおよびスキャン・ヘッダー内のチャネル数は書き込まれるバンド数と常に一致する必要があり、一致しない場合には例外がスローされます。app0JFIF
およびapp14Adobe
ノードは、app14Adobe
ノードがYCbCrを示し、コンポーネントIDがJFIFと互換性がある場合(0-2)にのみ同じメタデータ・オブジェクトに存在することができます。さまざまなイメージ・タイプが次の方法で処理されます。
(すべてのマルチチャネル・イメージは、カラー・スペースにかかわらず、メタデータ・オブジェクトのフレーム・ヘッダー・ノード内のサンプリング係数に従ってサブサンプリングされます。)
app0JFIF
ノードが存在する場合、JFIF APP0
マーカー・セグメントが書き込まれます。
app14Adobe
ノードが存在する場合は、有効性(transform
がUNKNOWN
でなければなりません)がチェックされてから書き込まれます。
app0JFIF
ノードが存在する場合は無視され、警告がリスナーに送信されます。
app14Adobe
ノードが存在する場合は、有効性(transform
がUNKNOWN
でなければなりません)がチェックされてから書き込まれます。transform
がUNKNOWN
でない場合、リスナーに警告が送信され、正しい変換が書き込まれます。
app0JFIF
ノードが存在する場合、イメージはYCbCrに変換され、JFIF APP0
マーカー・セグメントとともに書き込まれます。イメージのColorSpace
が非標準のICCプロファイルに基づいている場合、そのプロファイルはAPP2
マーカー・セグメントに埋め込まれます。ColorSpace
は非標準のICCプロファイルに基づいていないものの、メタデータ内にapp2ICC
ノードが存在する場合、APP2
マーカー・セグメントは適切な標準プロファイルを使用して書き込まれます。ファイルはJFIFに準拠していなければならないため、プロファイルはRGBカラー・スペースを指定する必要があります。
app14Adobe
ノードが存在する場合、イメージはカラー変換の設定に従って変換され、Adobe APP14
マーカー・セグメントとともに書き込まれます。コンポーネントIDが、フレームおよびスキャン・ヘッダーに表示されたとおりに書き込まれます。カラー変換はYCbCrまたはUNKNOWN
である必要があります。UNKNOWN
の場合、イメージはカラー変換されません。
app0JFIF
ノードが存在する場合は無視され、警告がリスナーに送信されます。
app14Adobe
ノードが存在する場合、イメージはAdobe APP14
マーカー・セグメントとともに書き込まれます。カラー・スペース変換は行われません。コンポーネントIDが、フレームおよびスキャン・ヘッダーに表示されたとおりに書き込まれます。カラー変換はUNKNOWN
である必要があります。それ以外の場合は、警告がリスナーに送信されます。
app14Adobe
ノードが存在しない場合は、フレーム・ヘッダー内のコンポーネントIDが参照されます。これらが前述のとおりにカラー・スペースを示している場合は、可能な場合、そのカラー・スペースにイメージが変換されます。コンポーネントIDがカラー・スペースを示していない場合は、サンプリング係数が参照されます。イメージがサブサンプリングされる場合は、YCbCrAに変換されます。イメージがサブサンプリングされない場合は、変換が適用されません。特殊なマーカー・セグメントは書き込まれません。
app0JFIF
ノードが存在する場合、イメージはsRGBに変換されたあと、符号化中にYCbCrに変換され、JFIF APP0
マーカー・セグメントが書き込まれます。
app14Adobe
ノードが存在する場合は、変換が適用されず、Adobe APP14
マーカー・セグメントが書き込まれます。カラー変換はYCCである必要があります。それ以外の場合は、警告がリスナーに送信されます。
app0JFIF
ノードが存在する場合は無視され、警告がリスナーに送信されます。
app14Adobe
ノードが存在する場合は、変換が適用されず、Adobe APP14
マーカー・セグメントが書き込まれます。カラー変換はUNKNOWN
である必要があります。それ以外の場合は、警告がリスナーに送信されます。
app0JFIF
およびapp0JFXX
ノードには、サムネールのピクセル・データは含まれません。ただし、書き込まれるサムネールの種類は、次のようにメタデータ・オブジェクトの内容によって異なります。インデックス付きまたはRGBイメージとして書き込まれるサムネール、および255×255よりも大きいサムネールは、縮小ではなく、255×255にクリッピングされます。JPEGイメージとして書き込まれるサムネールのサイズに制限はありません。サムネールがクリッピングされる場合には、警告がリスナーに送信されます。
app0JFXX
ノードが存在しない場合、またはメタデータに存在する最初のapp0JFXX
ノードにJFIFthumbPalette
要素が含まれている場合は、JFXX APP0
マーカー・セグメントにパレット・サムネールが書き込まれます。
app0JFXX
ノードに別のサムネール形式(RGBまたはJPEG)が含まれている場合、パレット・イメージはRGBに拡張され、示されたサムネール形式が書き込まれます。
app0JFXX
ノードが存在しない場合は、サムネールがJFIF APP0
マーカー・セグメントの一部として書き込まれます。
app0JFXX
ノードにJFIFthumbRGB
要素が含まれる場合は、RGBサムネールがJFXX APP0
マーカー・セグメントに書き込まれます。
app0JFXX
ノードにJFIFthumbJPEG
要素が含まれる場合は、JPEGサムネールがJFXX APP0
マーカー・セグメントに書き込まれます。
app0JFXX
ノードにJFIFthumbPalette
要素が含まれる場合は、RGBサムネールがJFXX APP0
マーカー・セグメントに書き込まれ、警告がリスナーに送信されます。
app0JFXX
ノードが存在しない場合は、サムネールがRGBに拡張され、JFIF APP0
マーカー・セグメントの一部として書き込まれます。
app0JFXX
ノードにJFIFthumbRGB
要素が含まれる場合は、サムネールがRGBに拡張され、独立したJFXX
RGBマーカー・セグメントに書き込まれます。
app0JFXX
ノードにJFIFthumbJPEG
要素が含まれる場合は、JPEGサムネールがJFXX APP0
マーカー・セグメントに書き込まれます。
app0JFXX
ノードにJFIFthumbPalette
要素が含まれる場合は、JPEGサムネールがJFXX APP0
マーカー・セグメントに書き込まれ、警告がリスナーに送信されます。
APP0
セグメント内にサムネールが配置されていない場合を除いて各セグメントは上記のとおり処理され、各サムネールのために参照されるapp0JFXX
ノードは、サムネールと同じシーケンスで発生するメタデータのapp0JFXX
ノードです。app0JFXX
ノードは最初のサムネールに、2番目のノードは2番目のサムネールに適用されます(以降同様)。メタデータのapp0JFXX
ノードがサムネールより少ない場合、これらのサムネールは一致するapp0JFXX
ノードがないと見なされます。一致するapp0JFXX
ノードのないRGBサムネールは、JFXX APP0
マーカー・セグメントに書き込まれます。一致するapp0JFXX
ノードのないグレー・スケール・サムネールは、JPEGイメージとしてJFXX APP0
マーカー・セグメントに書き込まれます。
サムネールを格納するメカニズムだけがJFIFまたはJFIF拡張マーカー・セグメントを使用するため、グレー・スケールまたはRGBイメージだけがサムネールを持つことができます。その他のイメージ・タイプを書き込むときにサムネールが存在する場合、サムネールは無視され、警告が警告リスナーに送信されます。
ImageWriteParam
ではプログレッシブ・エンコーディングを有効にする必要があり、これが有効になっていないと、メタデータ・オブジェクトに含まれるスキャン・ヘッダーにかかわらず、イメージが順番に書き込まれます。プログレッシブ・エンコーディングが有効で、メタデータからコピーするように設定されている場合、メタデータのスキャン・ヘッダーの順序を使用してイメージが書き込まれます。プログレッシブ・エンコーディングが有効で、デフォルトを使用するように設定されている場合、メタデータのスキャンは無視されてスキャンのデフォルト設定が使用されます。プログレッシブ・エンコーディングでは常に、最適化されたハフマン表が強制的に使用されます。メタデータに存在するハフマン表は無視され、警告が警告リスナーに送信されます。ハフマン表の最適化はImageWriteParam
で要求され、メタデータまたはImageWriteParam
自身のハフマン表はすべて無視され、そのような表が存在する場合には警告が警告リスナーに送信されます。
IIOMetadata
オブジェクトによって実際に返されるメタデータ・オブジェクトのツリーだけを記述しています。これらの解析の区切り文字は意味のあるメタデータを持たないため、SOI
、EOI
、またはRST
マーカーに対応するノードは含まれていません。
最初のノードは常にJPEGvariety
ノードです。JPEGメタデータ形式のjavax_imageio_jpeg_image_1.0
バージョンでは、このノードが1つの子であるapp0JFIF
ノードを持つ場合(JPEGストリームにJFIFマーカー・セグメントと関連データが含まれることを示す)と、子を持たない場合(ストリームにJFIFマーカーが含まれないことを示す)があります。JPEGメタデータ形式の今後のバージョンでは、JPEGvariety
ノードの子として表示されるその他のタイプのノードを定義することで、ほかのさまざまなJPEGメタデータ(Exifなど)がサポートされる可能性があります。
(javax_imageio_jpeg_image_1.0
形式のメタデータ・ツリー構造でExifメタデータを解釈しようとするアプリケーションは、APP1
マーカーを示し、それをExifマーカー・セグメントとして識別するデータを含んだタグのあるunknown
マーカー・セグメントを調べる必要があります。そのあとで、アプリケーション固有のコードを使用してマーカー・セグメント内のデータを解釈できます。そのようなアプリケーションがJPEGメタデータ形式の今後のバージョンに従ってフォーマットされたメタデータ・ツリーを検出した場合、Exifマーカー・セグメントはその形式のunknown
ではなく、JPEGvariety
ノードの子ノードとして構造化される可能性があります。このため、アプリケーションはIIOMetadata
オブジェクトの取得に使用されるメソッドまたはコンストラクタにバージョンを識別する文字列を渡すことで、使用するバージョンを識別することが重要です。)
読込み時には、JFXX
およびapp2ICC
ノードがapp0JFIF
ノードの子として発生します。これは、JFXX APP0
およびAPP2
マーカー・セグメントがストリーム内のどこで実際に発生するかにかかわらず当てはまります。markerSequence
ノード内のノードの順序は、JPEGストリーム内にあるマーカー・セグメントの順序に対応します。
書込み時には、常に最初のノードでなければならないapp0JFIF
ノード(それ自身がJPEGvariety
ノードの子)の子としてJFXX
およびapp2ICC
ノードが発生します。(ストリームがJFIFに準拠していない場合は、app0JFIF
ノードは提供されず、JPEGvariety
ノードは子を持ちません。)まずJFIF APP0
、JFXX APP0
、およびAPP2
マーカー・セグメントが書き込まれ、次にmarkerSequence
ノード内に対応するノードが現れる順序ですべてのAdobe APP14
、APPn
、COM
、および不明なセグメントが書き込まれ、次にDQT
(および非プログレッシブ書込みにはDHT
)マーカー・セグメント、続いてSOF
およびSOS
マーカー・セグメントが書き込まれます。プログレッションの制御にメタデータを使用するプログレッシブ書込みでは、対応するノードがmarkerSequence
ノードに存在している順序でSOS
セグメントが使用されます。
reset
、mergeTree
、およびsetFromTree
操作は、JPEGプラグイン・メタデータ・オブジェクトに対して次のセマンティックスを持ちます。
reset
- reset
の呼出しは、ストリームの読込みで作成されたものかImageWriter
からデフォルトのオブジェクトを取得したものかにかかわらず、メタデータ・オブジェクトを作成直後と同じ状態に復元します。これは、メタデータ・オブジェクトが作成後に何度変更されたかにかかわらず当てはまります。
mergeTree
- ネイティブ形式
mergeTree
操作は、次のDTDに従う有効なツリーを受け入れ、次の順序付けルールを使用してノードをマージします。すべての場合において、新しいノードに存在するデータのみが対応する既存のノード(存在する場合)内で変更されます。つまり、mergeTree
を使用してそれらのノードを削除することはできません。ノードを削除するには、setFromTree
を使用します。ツリーはIIOMetadataNode
で構成される必要があります。
app0JFIF
app0JFIF
ノードがすでに存在する場合は、新しいノードの内容によって既存のノードが変更されます。
dqt
dqt
ノードがすでに存在する場合、dqt
ノード内では、ノード内の各表によって同じ表IDを持つ最初の表が置き換えられます。
dqt
ノードに同じIDの表が含まれていない場合、その表は既存の最後のdqt
ノードに追加されます。
dqt
ノードが存在しない場合は、次のように新しいノードが作成され、追加されます。
dht
ノードが存在する場合は、最初のノードの前に新しいdqt
ノードが挿入されます。
dht
ノードが存在しない場合は、sof
ノード(存在する場合)の前に新しいdqt
ノードが挿入されます。
sof
ノードが存在しない場合は、最初のsos
ノード(存在する場合)の前に新しいdqt
ノードが挿入されます。
sos
ノードが存在しない場合は、シーケンスの最後に新しいdqt
ノードが追加されます。
dht
dht
ノードがすでに存在する場合、dht
ノード内では、ノード内の各表によって同じ表クラスと表IDを持つ最初の表が置き換えられます。
dht
ノードに同じクラスとIDを持つ表が含まれていない場合、その表は既存の最後のdht
ノードに追加されます。
dht
ノードが存在しない場合は、次のように新しいノードが作成され、追加されます。
dqt
ノードが存在する場合は、最後のdqt
ノードの直後に新しいdht
ノードが挿入されます。
dqt
ノードが存在しない場合は、sof
ノード(存在する場合)の前に新しいdht
ノードが挿入されます。
sof
ノードが存在しない場合は、最初のsos
ノード(存在する場合)の前に新しいdht
ノードが挿入されます。
sos
ノードが存在しない場合は、シーケンスの最後に新しいdht
ノードが追加されます。
dri
dri
ノードがすでに存在する場合は、再起動の間隔の値が更新されます。
dri
ノードが存在しない場合は、次のように新しいノードが作成され、追加されます。
sof
ノードが存在する場合は、その前に新しいdri
ノードが挿入されます。
sof
ノードが存在しない場合は、最初のsos
ノード(存在する場合)の前に新しいdri
ノードが挿入されます。
sos
ノードが存在しない場合は、シーケンスの最後に新しいdri
ノードが追加されます。
com
com
ノードが作成され、挿入されます。
com
ノードがすでに存在する場合は、最後のノードの後ろに新しいノードが挿入されます。
com
ノードが存在しない場合は、app14Adobe
ノードの後ろに(存在する場合)新しいcom
ノードが挿入されます。
app14Adobe
ノードが存在しない場合は、シーケンスの最初に新しいcom
ノードが挿入されます。
app14Adobe
app14Adobe
ノードがすでに存在する場合は、その属性は既存のノードから更新されます。
app14Adobe
ノードが存在しない場合は、次のように新しいノードが作成され、追加されます。
app14Adobe
ノードが最後のunknown
ノード(存在する場合)の後ろに挿入されます。
unknown
ノードが存在しない場合は、シーケンスの最初に新しいapp14Adobe
ノードが挿入されます。
unknown
unknown
ノードが作成され、シーケンスに追加されます。
unknown
マーカー・ノードがすでに存在する場合は、最後のノードの後ろに新しいノードが挿入されます。
unknown
ノードが存在しない場合は、app14Adobe
ノード(存在する場合)の前に新しいunknown
ノードが挿入されます。
app14Adobe
ノードが存在しない場合は、シーケンスの最初に新しいunknown
ノードが挿入されます。
sof
sof
ノードがすでに存在する場合は、その値は既存のノードから更新されます。
sof
ノードが存在しない場合は、次のように新しいノードが作成され、追加されます。
sos
ノードが存在する場合は、最初のノードの前に新しいsof
ノードが挿入されます。
sos
ノードが存在しない場合は、シーケンスの最後に新しいsof
ノードが追加されます。
sos
sos
ノードがすでに存在する場合は、その値は既存のノードから更新されます。
sos
ノードが複数存在する場合は、sos
ノードをプログレッシブ・スキャンのセットにマージできないため、IIOInvalidTreeException
がスローされます。
sos
ノードが存在しない場合は、新しいノードが作成され、シーケンスの最後に追加されます。
mergeTree
- 標準形式
mergeTree
操作は、標準形式のツリーの場合、次の方法でネイティブ・ツリーを変更します。
Chroma
- Chroma
ノードのColorSpaceType
サブノードによって、圧縮イメージのターゲット・カラー・スペースを変更できます。新しいカラー・スペースの選択によって、上記のアルゴリズムに従っていくつかの変更が生じることがあります。app0JFIF
およびapp14Adobe
ノードの追加または削除、サブサンプリングの追加または削除、コンポーネントIDの変更が行われることがあり、それに応じてsof
およびsos
ノードが更新されます。必要に応じて、追加の数量化表およびハフマン表が追加されます。数量化表の場合、既存表の品質レベルに合わせてデフォルトがスケーリングされます。既存の表を含まないメタデータには表は追加されません。既存のメタデータがプログレッシブ・エンコーディングを指定している場合は、チャネル数を変更しないでください。Alpha
サブノードのnone
の明示的な値によってアルファ・チャネルが削除される場合や、none
以外によってアルファ・チャネルが追加される場合があるため、Transparency
ノードも考慮されます。
Dimension
- PixelAspectRatio
仕様によってapp0JFIF
ノード(存在する場合)の内容が変更されたり、適切な値を含むapp0JFIF
ノード(可能な場合)が追加されたりする場合があります。浮動小数点の比率から、ノードに含める適切な整数のペアが計算されます。
Text
- 圧縮解除された各テキスト項目はcom
ノードに変換され、com
ノードをマージするための上記のルールに従って挿入されます。
setFromTree
- ネイティブ形式
setFromTree
操作は、後述するネイティブ形式のツリーの場合、単に既存のツリー全体を新しいツリーで置き換えます。ツリーはIIOMetadataNode
で構成される必要があります。
setFromTree
- 標準形式
setFromTree
操作は、標準形式のツリーの場合、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 --> ]>