Java™ SE 6.0 での Image I/O の拡張機能 |
ガイドの索引 |
GIF ファイル形式の書き込みプラグイン
GIF ファイル形式の読み取り機能は Java SE 1.4 から使用可能になりましたが、
com.sun.media.imageio.plugins.gif
パッケージにはライターがありませんでした。新しく追加された GIF イメージライターでは、次の要件を満たすイメージの書き込みが可能になります。
- バンド数が 1 である
- サンプルごとのビット数が 8 以下である
- 色成分のサイズが 8 以下である
さらに、この GIF イメージライターを使用すると、
ImageWriter
クラスで定義された標準メソッドを使用して動画 GIF イメージを作成できます。GIF イメージライターの詳細については、「GIF イメージ形式の標準プラグイン」の注記を参照してください。ファイル形式のフィルタリングのための新しいメソッド
フィルタ処理されるファイル接尾辞を取得する 2 つの新しいメソッドがImageIO
クラスに導入されました。getReaderFileSuffixes()
メソッドとgetWriterFileSuffixes
メソッドは、現在登録されているリーダーとライターによって認識される形式に関連付けられたすべてのファイル接尾辞をリストするString
の配列を返します。
API とドキュメントの変更
4972087
Quality Desc
とQuality Values
の配列の長さが JPG では同じである。4953566
ImageInputStream
クラスのmark()
メソッドまたはreset()
メソッドが PNGImageReader
で正しく機能しない。
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_JPEG
とBI_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 圧縮の処理を次のように分けています。
- BI_RGB 圧縮では、BGR のラスターデータの順序を使用するようにしてください (BMP 仕様によって RGB データの順序が規定されている 16bpp イメージの場合を除く)。
- BI_BITFIELDS 圧縮では、ラスターデータの順序を、対応するマスクを使用して定義するようにしてください。デフォルトのビットフィールドマスクには、RGB のラスターデータの順序が使用されます。
パフォーマンスとリソースの管理
6299405
ImageInputStreamImpl
クラスで、java.lang.OutOfMemoryError
の原因となるfinalize()
メソッドが引き続き使用されている。
finalize()
メソッドを空にして、その (ストリームを閉じる) 機能をより迅速な機構で置き換える必要があります。サードパーティーの IISI サブクラスが、仕様に従ったclose()
メソッドの呼び出しをfinalize()
メソッドに依存している可能性があるため、finalize() メソッドをImageInputStreamImpl
レベルで簡単に空にすることはできません。ただし、Sun が管理している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
IFileCacheImageInputStream
とFileCacheImageOutputStream
はFile.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: JPGReader
が、Reader.getImageTypes
メソッドによって返されたTYPE_CUSTOM TypeSpecifier
の使用中に例外をスローする。埋め込まれたカラープロファイルでイメージの余分な色変換が発生したために色変換が削除された (
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
リーダーによって余分な色変換が実行されました。このバグは、余分な色変換操作を削除することによって修正されました。その他
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 © 1999-2006 Sun Microsystems, Inc. All Rights Reserved. |