Java SE 6.0でのImage I/Oの拡張機能

主な機能
修正されたバグ

主な機能

GIFファイル形式の書込みプラグイン

GIFファイル形式の読取り機能はJava SE 1.4から使用可能になりましたが、com.sun.media.imageio.plugins.gifパッケージにはライターがありませんでした。新しく追加されたGIFイメージ・ライターでは、次の要件を満たすイメージの書込みが可能になります。

さらに、このGIFイメージ・ライターを使用すると、ImageWriterクラスで定義された標準メソッドを使用して動画GIFイメージを作成できます。GIFイメージ・ライターの詳細については、「GIFイメージ形式の標準プラグイン」の注記を参照してください。

ファイル形式のフィルタ・リングのための新しいメソッド

フィルタ処理されるファイル接尾辞を取得する2つの新しいメソッドがImageIOクラスに導入されました。 getReaderFileSuffixes()メソッドと getWriterFileSuffixesメソッドは、現在登録されているリーダーとライターによって認識される形式に関連付けられているすべてのファイル接尾辞をリストするStringsの配列を返します。

修正されたバグ

APIとドキュメントの変更

4953566 ImageInputStream classmark()メソッドまたはreset()メソッドがImageReaderで正しく機能しない。

ImageReaderクラスがデコード・プロセスの一部としてflushBefore()を呼び出すことが許可されていることを明確にするために、ImageInputStreamクラス仕様に次の注記が追加されました。

ImageReaderは、読込み操作の一部としてflushBeforeを呼び出すことができることに留意してください。このため、アプリケーションがストリームをImageReaderに渡す前にmarkを呼び出す場合、読込み操作が完了したあともマーク位置が有効であると考えるべきではありません。

5068322 javax.imageio.plugins.jpeg.JPEGQTable.toString()メソッドが正しくない説明を生成する。

パッケージjavax.imageio.plugins.jpeg内のJPEGQTableクラスのtoString()メソッドは、表の値を含むStringオブジェクトを返すと想定されていましたが、代わりに表の先頭行のみを繰り返していました。実施した修正によってこのエラーは解消されました。

6359957 PNG仕様のドキュメントURL参照が間違っている。

javax.imageio.metadataパッケージ内のPNG仕様へのリンクは、次のURLに修正されました。

http://www.libpng.org/pub/png/spec/

6457035 ImageInputStreamImpl.read()メソッドのjavadocがない。

ImageInputStreamImpl.javaファイルで、抽象read()のメソッド定義に対するjavadocの先頭に「*」文字がありませんでした。この修正によって、欠けていた文字が埋められました。

BMPプラグインの機能強化

6294920 BMPImageReaderクラスが、BI_JPEG圧縮を使用してBMPライターでエンコードされた3BYTE_BGRイメージの読取りに失敗する。

BI_JPEG圧縮方式のイメージを書き込もうとしているときに、BMPImageReaderクラスによってjava.io.EOFExceptionがスローされました。この問題は、BMPImageReaderクラスが、BI_JPEGBI_PNGの両方の方式の埋め込まれたイメージを処理していなかったために発生しました。この問題を解決するために、埋め込まれたイメージの処理が別のコードに移動されました。

6297016 BI_BITFIELDS圧縮でバッファリングされたTYPE_3BYTE_BGRイメージの書込み時に出力のBMPイメージが歪む。

BMPWriterクラスとBI_BITFIELDS圧縮方式を使用して、TYPE_3BYTE_BGR方式のバッファリングされたイメージをファイルに書き込もうとしているときに、出力イメージが歪み、使用不可になりました。この問題は、bmpイメージに適用されたビット・フィールド・マスクが原因で発生しました。ただし、BMP形式の要件に従って、イメージ・データのレイアウトは変更されませんでした。この問題を修正するために、writePixels()メソッドを使用してイメージ・データを正しくコピーするようになりました。

5076878 ImageIO BMPライターが24ビット・イメージに対して32ビットのファイルを書き込む。

ソース・イメージの1ピクセル当たりのビット数が24の場合でも、ImageIO.writeメソッドはBMPファイルを32ビット・イメージとして示していました。この修正により、1ピクセル当たりのビット数がデータ・バッファ・タイプのサイズより小さい場合は常に、writePixelsプロシージャが有効になります。たとえば、TYPE_INT_RGBでは、データ・バッファ・タイプのサイズが32でも、実際の1ピクセル当たりのビット数は24です。

6332480 BMPReaderクラスが、BI_RLE8圧縮を使用してBMPWriterクラスでエンコードされたTYPE_BYTE_GRAYイメージの読取りに失敗する。

BMPReaderクラスは、BI_RLE8圧縮を使用してBMPWriterクラスで書き込まれたTYPE_BYTE_GRAYイメージを正しく読み取りませんでした。この問題は、RLEデコード手続き(RLE4とRLE8の両方)で、コピーのためのイメージ行の範囲を計算するために、デスティネーション領域の高さではなく幅を誤って使用していたために発生しました。実施した修正では、範囲の計算にデスティネーション領域の高さを使用します。

6399660圧縮でサブサンプリングを使用すると、BMPの一部のイメージの種類の色が変わる。

BMPでサポートされているすべての圧縮方式を使用していると、ぼかし、色の見た目の違い、イメージのわずかな破損など、イメージへの異なる効果が検出されました。実施した修正では、BI_RGB圧縮とBI_BITFIELDS圧縮の処理を次のように分けています。

パフォーマンスとリソースの管理

6299405 ImageInputStreamImplクラスは引き続きfinalize()メソッドを使用し、java.lang.OutOfMemoryErrorが発生する。

finalize()メソッドを空にして、その(ストリームを閉じる)機能をより迅速なメカニズムで置き換える必要があります。サード・パーティのIISIサブクラスが、仕様に従ったclose()メソッドの呼出しをfinalize()メソッドに依存している可能性があるため、finalize()メソッドをImageInputStreamImplレベルで簡単に空にすることはできません。ただし、Oracleが管理しているImageInputStreamImplサブクラスでは、finalize()メソッドを空にすることができます。代わりに、Java2D処置機能メカニズムが使用されます。

6266748 JPEGImageWriter.write()メソッドでラスターのコピーが作成される。

JPEGImageWriterクラスのwrite()メソッドには、メモリー効率の低いコードが含まれています。推奨される修正は、単純なレンダリングされるイメージのパフォーマンスの向上に役立ちます。

6336804 javax.imageio.ImageIOクラスが一部のメソッドでリークを処理する場合がある。

javax.imageio.ImageIOクラス内の一部のread()およびwrite()簡易メソッドでは、ストリームが正常に閉じられず、tryブロックやfinallyブロックでリーダー・インスタンスまたはライター・インスタンスが破棄されました。修正として、各メソッドのjavadocに、提供されているストリームを閉じる操作が呼出し側の責任かどうかを示す適切な注記が追加されました。

6347575 FileImageInputStream.readInt()および同様のメソッドが効率的でない。

FileImageInputStream 4xのread()メソッドの呼出しは、キャッシュされたバイト配列を使用した、read(byte[])メソッドの単一の呼出しに比べてはるかに大きな負荷がかかりました。このことが、小さなPNGやその他のイメージの読取りパフォーマンスに重大な影響を与えていました。この修正は、ImageInputStreamImplクラスのreadShort()メソッドとreadInt()メソッドのために実施されました。

6348744 ignoreMetadataフラグの値がtrueの場合、PNGImageReaderクラスはメタデータをスキップするようにする。

JDK 6の前までは、ignoreMetadataフラグが設定されている場合でも、PNGImageReaderクラスはすべてのイメージ・メタデータを読み取りました。この修正では、ignoreMetadataフラグがtrueの場合はメタデータのブロックをスキップすることによって、小さなPNGイメージを読み取るときのオーバーヘッドを削減し、パフォーマンスを向上させます。

6354056 JPEGImageReaderクラスは最適化が可能である。

JPEGイメージ・リーダーは、デコードされたデータをメモリーにコピーしますが、その方法は最適化されていませんでした。実施した修正では、一度に1バイトずつコピーする代わりに、memcpy()メソッドを使用することによってこの操作を改善しています。

6354112実行時のパフォーマンスを向上させるためのlibjpegのコンパイラ最適化レベルの向上。

JDK内のlibjpegライブラリは、デフォルトのコンパイラ最適化フラグを使用してビルドされました。ネイティブなIJG JPEGライブラリがより高速に実行できるようにするために、これらのフラグの値をより高いレベルに上げました。

6404011 IllegalArgumentException: 特定のJPEGイメージを読み取っているときに「無効なICCプロファイル・データ」が発生する。

このバグは非チェック例外であり、一部のプラットフォームでシステム・クラッシュの原因になる可能性があります。この修正は、ICC_ProfileによってスローされるIllegalArgumentExceptionをキャッチし、無効なカラー・プロファイルを考慮せずにイメージを処理します。

堅牢性

6291034 IFileCacheImageInputStreamFileCacheImageOutputStreamFile.deleteOnExitメソッドの使用を回避するようにする。

FileCacheImageInputStreamクラスとFileCacheImageOutputStreamクラスはどちらも、FileクラスのdeleteOnExitメソッドの機能を使用していました。この修正は、File.deleteOnExit()の機能を、VMがシャットダウンする前にまだ開いているストリームを閉じるシャットダウン・フックで置き換えました。

4892630 ImageReaderクラスが、一部のメソッドに渡されるイメージのインデックスを検証しない。

ImageReaderクラスのgetWidth(imgIndex)getHeight(imgIndex)、およびgetAspectRatio(imgIndex)メソッドは、指定されたPNGイメージのインデックスが範囲外であってもIndexOutOfBoundsExceptionをスローしませんでした。実施した修正では、例外を適切にスローすることによってこの問題を解決しています。

4895547リーダーから取得されたJPEGImageMetadataが、mergeTree()メソッドを呼び出しているときにNullPointerExceptionをスローする。

親属性のリストに子ノードに関連した属性が含まれていなかったため、子に関連した属性を取得しようとしているときに、MarkerSegment.getAttributeValue()メソッドでNullPointerExceptionが発生しました。実施した修正により、子ノードから属性リストが取得されます。

4528643ネイティブなJPEGコードが、GetPrimitiveArrayCriticalのスコープ内でJNI呼出しを行う。

非標準の-Xcheck:jniフラグを使用してJPEGイメージの読み取りまたは書込みを行う任意のアプリケーションを実行すると、JPEGImageReaderクラスのいくつかのメソッドで次のエラーが発生します。

Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical

この修正では、影響を受けるメソッドがRELEASE/GET_ARRAYSマクロで囲まれています。 

5076692アプレット・コンテキストでインストール型拡張機能Image I/O読込みプラグイン/書込みプラグインを使用できない。

この問題は、imageioレジストリの初期化コードが、そのレジストリのコードがアプレット・コンテキストから呼び出されたときにjava.ext.dirs内のjarに対する読取りアクセス権を持っていないために発生しました。そのため、アプレットの場合は、java.ext.dirsにインストールされたimageioプラグインを使用できませんでした。この修正の考え方は、特権付きアクション・ブロック内のjava.ext.dirsからプラグインを登録することです。

6342404 ImageIOプラグインの失敗によって、すべてのリーダーが失敗する。

ImageIOプラグインのコードをクラス・パスから削除しても、そのプラグインのImageReaderのエントリをMETA-INF/サービスに含めたままにしておくと、すべてのImageIOプラグインの使用が不可能になりました。このバグを修正するために、IIORegistry.registerApplicationClasspathSpis()メソッドに「tryおよびcatch」ブロックを追加してServiceConfigurationErrorをキャッチするようにしました。

6395551デスティネーションのタイプをredr.getImageTypes()によって返されたタイプの指示子に設定すると、JPGの例外がスローされる。

この問題は、イメージ・ヘッダーが読み取られると常に、埋め込まれたカラー・プロファイルに対して新しいColorSpaceインスタンスが再作成されたために発生しました。さらに、ColorSpaceクラスとICC_Profileクラスの正しい比較のための手段がありませんでした。この手段がないために、ImageTypeSpecifierクラスのインスタンスの比較は不可能でした。この問題に対して提案された回避方法では、iccCSインスタンスに、新しく読み取られたインスタンスと同じプロファイル・データが含まれている場合が検出されます。検出された場合は「古い」インスタンスが残され、それ以外の場合(プロファイル・データが異なるように見える場合)は埋め込まれたカラー・プロファイルに対して新しいカラー領域インスタンスが作成されます。

6399616 PIT: Reader.getImageTypesメソッドによって返されたTYPE_CUSTOM TypeSpecifierを使用すると、JPGReaderが例外をスローする。

埋め込まれたカラー・プロファイルでイメージの余分な色変換が発生したために色変換が削除された(JPEGImageReader.javaの行783 - 786)、4705399の修正によって回帰が発生しました。ただし、デスティネーションのタイプによって、埋め込まれたプロファイルを含まないイメージの別のカラー領域が定義されていた場合は、この変換が必要でした。この場合の修正により、復号器によって生成されたsRGBからのイメージ・データが、デスティネーション・イメージで使用されるカラー領域に変換されます。

品質

5028259 JPEGイメージのデスティネーション・イメージのタイプを設定すると、結果のファイルのサイズが増加する。

デスティネーションのタイプで明示的に書込みパラメータを使用してJPEGイメージを書き込んだ場合は、暗黙的に同じデスティネーションのタイプが使用された場合より、結果のファイルのサイズが大きくなりました。この問題は、デスティネーションのタイプは指定されているが、対応するメタデータ・オブジェクトが指定されていなかった場合に判明しました。この修正により、SOFマーカー・オブジェクトを作成するために、指定されたデスティネーションのタイプを使用してメタデータ・オブジェクトが作成されます。このマーカー・オブジェクトは、QtableSelectorsのデフォルト値を変更するために使用されます。

4881314 ImageIOによって特定の標準JPGファイルが正しく読み取られない。

ImageIOによって、一部のJPGファイルが誤って読み取られます。その結果、写真のネガのように見える赤色または緑色のイメージが生成されました。この修正によって、EXIFイメージのカラー領域の変換が排除されます。EXIFイメージを検出するために、イメージ・ヘッダー内のAPP1マーカーのチェックが追加されました。

5098176一部のPNGイメージがImageIOクラスでのロードに失敗する。

PNGImageReaderは、イメージ・パレットの長さが2 bitDepthより短い場合、インデックスの付いたPNGイメージに対応するImageTypeSpecifierインスタンスの作成に失敗しました。この制限を回避するために、適切な2のべき乗のサイズの新しいパレット配列が作成されました。外観が元のパレットに存在しない色にならないようにするために、これらの配列は、元の配列の最後の値でパディングされます。

6372769 ImageIO.readメソッドがNikon Jpegsを誤ってデコードする。

イメージに、埋め込まれたカラー・プロファイルが含まれている場合、ImageIO jpegリーダーによって余分な色変換が実行されました。このバグは、余分な色変換操作を削除することによって修正されました。

その他

4972087 Quality DescQuality Valuesの配列の長さがJPGでは同じである。

仕様に従って、getCompressionQualityValues()メソッドがgetCompressionQualityDescriptions()によって返される配列より1つ大きい長さの配列を返すように、JPEGImageWriteParamクラスが更新されました。

6195593リグレッション: javax/imageio/IRPTest.javaファイルが失敗する。

この問題は、バグ5039494の修正が原因でした。この修正から、デスティネーション領域の計算にはImageReader.computeRegion()メソッドが使用されました。計算されたデスティネーション領域と、パラメータからのデスティネーション・オフセットの不一致を回避するために、計算された値に従ってdestinationOffsetが更新されます。

6304433テストのバグ: バグ6291034のための回帰テストがすべてのプラットフォームで失敗する。

回帰テストの失敗は、出力イメージ・ファイルの作成が原因で発生しました。このファイルは、作業ディレクトリ内の既存のファイルをカウントしたあとに作成され、回帰テストが完了しても削除されませんでした。そのため、VMの終了時にはすべての一時ファイルが削除されたにもかかわらず、回帰テストを実行したあと、作業ディレクトリには常に余分なファイルが1つ含まれていました。この問題を解決するには、ファイルの入力または出力ストリームの代わりにバイト配列の入力または出力ストリームを使用して、作業ディレクトリに余分なファイルが作成されるのを回避します。

6356926 PIT: 回帰テストjavax/imageio/stream/DeleteOnExit.shが失敗する。

この問題は、バグ6299405の修正が原因でした。影響を受けるコードは修正され、対応するコメントが追加されました。

6459309 NoAPP0Test.java回帰テストがすべてのプラットフォームで失敗する。

6279846の修正の一部として更新されたsRGBプロファイルの新しいバージョンを使用することによって、ピクセル値の違いが発生します。新しいプロファイルはb92ビルドで統合されました。

6363748 FileCacheImageInputStreamクラスのclose()メソッドが失敗する。

この問題は、バグ6299405の修正が原因でした。その修正の一部として、FileCacheImageInputStream.close()メソッドが、キャッシュ・オブジェクトへの参照をnullにするように変更されました。この問題を解決するために、FCIIS.read()メソッドが、指定のとおりにcheckClosed()メソッドを呼び出すように更新されました。

 


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.