|
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. |
|