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()
メソッドを呼び出すように更新されました。