GIF ファイル形式の読み取り機能は Java SE 1.4 から使用可能になりましたが、com.sun.media.imageio.plugins.gif パッケージにはライターがありませんでした。新しく追加された GIF イメージライターでは、次の要件を満たすイメージの書き込みが可能になります。
さらに、この GIF イメージライターを使用すると、ImageWriter クラスで定義された標準メソッドを使用して動画 GIF イメージを作成できます。GIF イメージライターの詳細については、「GIF イメージ形式の標準プラグイン」の注記を参照してください。
ImageIO クラスに導入されました。 getReaderFileSuffixes() メソッドと getWriterFileSuffixes メソッドは、現在登録されているリーダーとライターによって認識される形式に関連付けられているすべてのファイル接尾辞をリストする Strings の配列を返します。
ImageInputStream class の mark() メソッドまたは reset() メソッドが ImageReader で正しく機能しない。ImageReader クラスがデコードプロセスの一部として flushBefore() を呼び出すことが許可されていることを明確にするために、ImageInputStream クラス仕様に次の注記が追加されました。
ImageReader は、読み込み操作の一部として flushBefore を呼び出すことができることに留意してください。このため、アプリケーションがストリームを ImageReader に渡す前に mark を呼び出す場合、読み込み操作が完了したあともマーク位置が有効であると考えるべきではありません。
javax.imageio.plugins.jpeg.JPEGQTable.toString() メソッドが正しくない説明を生成する。javax.imageio.plugins.jpeg 内の JPEGQTable クラスの toString() メソッドは、テーブルの値を含む String オブジェクトを返すと想定されていましたが、代わりにテーブルの先頭行のみを繰り返していました。実施した修正によってこのエラーは解消されました。
javax.imageio.metadata パッケージ内の PNG 仕様へのリンクは、次の URL に修正されました。
http://www.libpng.org/pub/png/spec/
ImageInputStreamImpl.read() メソッドの javadoc がない。ImageInputStreamImpl.java ファイルで、抽象 read() のメソッド定義に対する javadoc の先頭に「*」文字がありませんでした。この修正によって、欠けていた文字が埋められました。
BMPImageReader クラスが、BI_JPEG 圧縮を使用して BMP ライターでエンコードされた 3BYTE_BGR イメージの読み取りに失敗する。BI_JPEG 圧縮方式のイメージを書き込もうとしているときに、BMPImageReader クラスによって java.io.EOFException がスローされました。この問題は、BMPImageReader クラスが、BI_JPEG と BI_PNG の両方の方式の埋め込まれたイメージを処理していなかったために発生しました。この問題を解決するために、埋め込まれたイメージの処理が別のコードに移動されました。
BI_BITFIELDS 圧縮でバッファリングされた TYPE_3BYTE_BGR イメージの書き込み時に出力の BMP イメージが歪む。BMPWriter クラスと BI_BITFIELDS 圧縮方式を使用して、TYPE_3BYTE_BGR 方式のバッファリングされたイメージをファイルに書き込もうとしているときに、出力イメージが歪み、使用不可になりました。この問題は、bmp イメージに適用されたビットフィールドマスクが原因で発生しました。ただし、BMP 形式の要件に従って、イメージデータのレイアウトは変更されませんでした。この問題を修正するために、writePixels() メソッドを使用してイメージデータを正しくコピーするようになりました。
ソースイメージの 1 ピクセルあたりのビット数が 24 の場合でも、ImageIO.write メソッドは BMP ファイルを 32 ビットイメージとして示していました。この修正により、1 ピクセルあたりのビット数がデータバッファータイプのサイズより小さい場合は常に、writePixels プロシージャーが有効になります。たとえば、TYPE_INT_RGB, では、データバッファータイプのサイズが 32 でも、実際の 1 ピクセルあたりのビット数は 24 です。
BMPReader クラスが、BI_RLE8 圧縮を使用して BMPWriter クラスでエンコードされた TYPE_BYTE_GRAY イメージの読み取りに失敗する。BMPReader クラスは、BI_RLE8 圧縮を使用して BMPWriter クラスで書き込まれた TYPE_BYTE_GRAY イメージを正しく読み取りませんでした。この問題は、RLE デコード手続き (RLE4 と RLE8 の両方) で、コピーのためのイメージ行の範囲を計算するために、デスティネーション領域の高さではなく幅を誤って使用していたために発生しました。実施した修正では、範囲の計算にデスティネーション領域の高さを使用します。
BMP でサポートされているすべての圧縮方式を使用していると、ぼかし、色の見た目の違い、イメージのわずかな破損など、イメージへの異なる効果が検出されました。実施した修正では、BI_RGB 圧縮と BI_BITFIELDS 圧縮の処理を次のように分けています。
ImageInputStreamImpl クラスは引き続き finalize() メソッドを使用し、java.lang.OutOfMemoryError が発生する。finalize() メソッドを空にして、その (ストリームを閉じる) 機能をより迅速なメカニズムで置き換える必要があります。サードパーティーの IISI サブクラスが、仕様に従った close() メソッドの呼び出しを finalize() メソッドに依存している可能性があるため、finalize() メソッドを ImageInputStreamImpl レベルで簡単に空にすることはできません。ただし、Sun が管理している ImageInputStreamImpl サブクラスでは、finalize() メソッドを空にすることができます。代わりに、Java2D 処置機能メカニズムが使用されます。
JPEGImageWriter.write() メソッドでラスターのコピーが作成される。JPEGImageWriter クラスの write() メソッドには、メモリー効率の低いコードが含まれています。推奨される修正は、単純なレンダリングされるイメージのパフォーマンスの向上に役立ちます。
javax.imageio.ImageIO クラスが一部のメソッドでリークを処理する場合がある。javax.imageio.ImageIO クラス内の一部の read() および write() 簡易メソッドでは、ストリームが正常に閉じられず、try ブロックや finally ブロックでリーダーインスタンスまたはライターインスタンスが破棄されました。修正として、各メソッドの javadoc に、提供されているストリームを閉じる操作が呼び出し側の責任かどうかを示す適切な注記が追加されました。
FileImageInputStream 4x の read() メソッドの呼び出しは、キャッシュされたバイト配列を使用した、read(byte[])) メソッドの単一の呼び出しに比べてはるかに大きな負荷がかかりました。このことが、小さな PNG やその他のイメージの読み取りパフォーマンスに重大な影響を与えていました。この修正は、ImageInputStreamImpl クラスの readShort() メソッドと readInt() メソッドのために実施されました。
ignoreMetadata フラグの値が true の場合、PNGImageReader クラスはメタデータをスキップするようにする。JDK 6 の前までは、ignoreMetadata フラグが設定されている場合でも、PNGImageReader クラスはすべてのイメージメタデータを読み取りました。この修正では、ignoreMetadata フラグが true の場合はメタデータのブロックをスキップすることによって、小さな PNG イメージを読み取るときのオーバーヘッドを削減し、パフォーマンスを向上させます。
JPEGImageReader クラスは最適化が可能である。JPEG イメージリーダーは、デコードされたデータをメモリーにコピーしますが、その方法は最適化されていませんでした。実施した修正では、一度に 1 バイトずつコピーする代わりに、memcpy() メソッドを使用することによってこの操作を改善しています。
libjpeg のコンパイラ最適化レベルの向上。JDK 内の libjpeg ライブラリは、デフォルトのコンパイラ最適化フラグを使用してビルドされました。ネイティブな IJG JPEG ライブラリがより高速に実行できるようにするために、これらのフラグの値をより高いレベルに上げました。
このバグは非チェック例外であり、一部のプラットフォームでシステムクラッシュの原因になる可能性があります。この修正は、ICC_Profile によってスローされる IllegalArgumentException をキャッチし、無効なカラープロファイルを考慮せずにイメージを処理します。
IFileCacheImageInputStream と FileCacheImageOutputStream は File.deleteOnExit メソッドの使用を回避するようにする。FileCacheImageInputStream クラスと FileCacheImageOutputStream クラスはどちらも、File クラスの deleteOnExit メソッドの機能を使用していました。この修正は、File.deleteOnExit() の機能を、VM がシャットダウンする前にまだ開いているストリームを閉じるシャットダウンフックで置き換えました。
ImageReader クラスが、一部のメソッドに渡されるイメージのインデックスを検証しない。ImageReader クラスの getWidth(imgIndex)、getHeight(imgIndex)、および getAspectRatio(imgIndex) メソッドは、指定された PNG イメージのインデックスが範囲外であっても IndexOutOfBoundsException をスローしませんでした。実施した修正では、例外を適切にスローすることによってこの問題を解決しています。
JPEGImageMetadata が、mergeTree() メソッドを呼び出しているときに NullPointerException をスローする。親属性のリストに子ノードに関連した属性が含まれていなかったため、子に関連した属性を取得しようとしているときに、MarkerSegment.getAttributeValue() メソッドで NullPointerException が発生しました。実施した修正により、子ノードから属性リストが取得されます。
非標準の -Xcheck:jni フラグを使用して JPEG イメージの読み取りまたは書き込みを行う任意のアプリケーションを実行すると、JPEGImageReader クラスのいくつかのメソッドで次のエラーが発生します。
Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical
この修正では、影響を受けるメソッドが RELEASE/GET_ARRAYS マクロで囲まれています。
imageio レジストリの初期化コードが、そのレジストリのコードがアプレットコンテキストから呼び出されたときに java.ext.dirs 内の jar に対する読み取りアクセス権を持っていないために発生しました。そのため、アプレットの場合は、java.ext.dirs にインストールされた imageio プラグインを使用できませんでした。この修正の考え方は、特権付きアクションブロック内の java.ext.dirs からプラグインを登録することです。
ImageIO プラグインの失敗によって、すべてのリーダーが失敗する。ImageIO プラグインのコードをクラスパスから削除しても、そのプラグインの ImageReader のエントリを META-INF/サービスに含めたままにしておくと、すべての ImageIO プラグインの使用が不可能になりました。このバグを修正するために、IIORegistry.registerApplicationClasspathSpis() メソッドに「try および catch」ブロックを追加して ServiceConfigurationError をキャッチするようにしました。
この問題は、イメージヘッダーが読み取られると常に、埋め込まれたカラープロファイルに対して新しい ColorSpace インスタンスが再作成されたために発生しました。さらに、ColorSpace クラスと ICC_Profile クラスの正しい比較のための手段がありませんでした。この手段がないために、ImageTypeSpecifier クラスのインスタンスの比較は不可能でした。この問題に対して提案された回避方法では、iccCS インスタンスに、新しく読み取られたインスタンスと同じプロファイルデータが含まれている場合が検出されます。検出された場合は「古い」インスタンスが残され、それ以外の場合 (プロファイルデータが異なるように見える場合) は埋め込まれたカラープロファイルに対して新しいカラー領域インスタンスが作成されます。
Reader.getImageTypes メソッドによって返された TYPE_CUSTOM TypeSpecifier を使用すると、JPGReader が例外をスローする。埋め込まれたカラープロファイルでイメージの余分な色変換が発生したために色変換が削除された (JPEGImageReader.java の行 783 - 786)、4705399 の修正によって回帰が発生しました。ただし、デスティネーションのタイプによって、埋め込まれたプロファイルを含まないイメージの別のカラー領域が定義されていた場合は、この変換が必要でした。この場合の修正により、復号器によって生成された sRGB からのイメージデータが、デスティネーションイメージで使用されるカラー領域に変換されます。
デスティネーションのタイプで明示的に書き込みパラメータを使用して JPEG イメージを書き込んだ場合は、暗黙的に同じデスティネーションのタイプが使用された場合より、結果のファイルのサイズが大きくなりました。この問題は、デスティネーションのタイプは指定されているが、対応するメタデータオブジェクトが指定されていなかった場合に判明しました。この修正により、SOF マーカーオブジェクトを作成するために、指定されたデスティネーションのタイプを使用してメタデータオブジェクトが作成されます。このマーカーオブジェクトは、QtableSelectors のデフォルト値を変更するために使用されます。
ImageIO によって特定の標準 JPG ファイルが正しく読み取られない。ImageIO によって、一部の JPG ファイルが誤って読み取られます。その結果、写真のネガのように見える赤色または緑色のイメージが生成されました。この修正によって、EXIF イメージのカラー領域の変換が排除されます。EXIF イメージを検出するために、イメージヘッダー内の APP1 マーカーのチェックが追加されました。
ImageIO クラスでのロードに失敗する。PNGImageReader は、イメージパレットの長さが 2 bitDepth より短い場合、インデックスの付いた PNG イメージに対応する ImageTypeSpecifier インスタンスの作成に失敗しました。この制限を回避するために、適切な 2 のべき乗のサイズの新しいパレット配列が作成されました。外観が元のパレットに存在しない色にならないようにするために、これらの配列は、元の配列の最後の値でパディングされます。
ImageIO.read メソッドが Nikon Jpegs を誤ってデコードする。イメージに、埋め込まれたカラープロファイルが含まれている場合、ImageIO jpeg リーダーによって余分な色変換が実行されました。このバグは、余分な色変換操作を削除することによって修正されました。
Quality Desc と Quality Values の配列の長さが JPG では同じである。仕様に従って、getCompressionQualityValues() メソッドが getCompressionQualityDescriptions() によって返される配列より 1 つ大きい長さの配列を返すように、JPEGImageWriteParam クラスが更新されました。
javax/imageio/IRPTest.java ファイルが失敗する。この問題は、バグ 5039494 の修正が原因でした。この修正から、デスティネーション領域の計算には ImageReader.computeRegion() メソッドが使用されました。計算されたデスティネーション領域と、パラメータからのデスティネーションオフセットの不一致を回避するために、計算された値に従って destinationOffset が更新されます。
回帰テストの失敗は、出力イメージファイルの作成が原因で発生しました。このファイルは、作業ディレクトリ内の既存のファイルをカウントしたあとに作成され、回帰テストが完了しても削除されませんでした。そのため、VM の終了時にはすべての一時ファイルが削除されたにもかかわらず、回帰テストを実行したあと、作業ディレクトリには常に余分なファイルが 1 つ含まれていました。この問題を解決するには、ファイルの入力または出力ストリームの代わりにバイト配列の入力または出力ストリームを使用して、作業ディレクトリに余分なファイルが作成されるのを回避します。
javax/imageio/stream/DeleteOnExit.sh が失敗する。この問題は、バグ 6299405 の修正が原因でした。影響を受けるコードは修正され、対応するコメントが追加されました。
NoAPP0Test.java 回帰テストがすべてのプラットフォームで失敗する。6279846 の修正の一部として更新された sRGB プロファイルの新しいバージョンを使用することによって、ピクセル値の違いが発生します。新しいプロファイルは b92 ビルドで統合されました。
FileCacheImageInputStream クラスの close() メソッドが失敗する。この問題は、バグ 6299405 の修正が原因でした。その修正の一部として、FileCacheImageInputStream.close() メソッドが、キャッシュオブジェクトへの参照を null にするように変更されました。この問題を解決するために、FCIIS.read() メソッドが、指定のとおりに checkClosed() メソッドを呼び出すように更新されました。