Windows BMP 形式の画像を表すバイト配列があり、ピクセル データをコピーせずBufferedImage
に、ライブラリがそれを Java アプリケーションに として表示するようにしたいと考えています。
主な問題は、JDK の のすべての実装がRaster
イメージ ピクセルを上から下、左から右の順序で格納するのに対し、BMP ピクセル データは下から上、左から右の順序で格納されることです。これが補正されない場合、結果の画像は垂直方向に反転します。
最も明白な「解決策」は、SampleModel
のscanlineStride
プロパティを負の値に設定し、バンド オフセット (またはDataBuffer
の配列オフセット) を左上のピクセル、つまり配列の最後の行の最初のピクセルを指すように変更することです。 . SampleModel
残念ながら、負のscanlineStride
引数を指定するとすべてのコンストラクターが例外をスローするため、これは機能しません。
現在、リフレクションを使用してフィールドを負の値に強制することで回避していscanlineStride
ますが、可能であれば、よりクリーンで移植性の高い方法で実行したいと考えています。たとえば、カプセル化を壊さずに、ピクセルをボトムアップの順序で配置するRaster
またはをだます別の方法はありますか? または、ピクセル行を逆順に表示するandSampleModel
をラップするライブラリがどこかにありますか?Raster
SampleModel
次のアプローチは避けたいと思います。
- 画像全体をコピーする (パフォーマンス上の理由から。コードは 1 秒間に何百もの大きな (>= 1M ピクセル) 画像を処理する必要があり、アプリケーションは画像全体を利用できる必要がありますが、通常は小さな (しかし予測が難しい) 画像のみにアクセスします) ) 画像の一部です。)
- を変更し
DataBuffer
て座標変換を実行します (これは実際には機能しますが、バッファーはスキャンライン/ピクセル レイアウトについて知る必要がないため、別の「汚い」ソリューションです)。 Raster
および/またはインターフェースを最初から再実装するSampleModel
(互換性チェックが (少なくとも Sun JDK で) 実装されているため、特定のサブクラスが必要なSampleModel
ため、一般的なBottomUpSampleModel
ラッパー クラスは機能しません。)