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
レベルで簡単に空にすることはできません。ただし、Oracleが管理している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()
メソッドを呼び出すように更新されました。