ImageIO を使用して .HDR を読み取ることができるようになりました。:-)
これは最初のバージョンなので、端が少し荒いかもしれませんが、標準 (デフォルト設定) の Radiance RGBE.HDR
ファイルで動作するはずです。
BufferedImage
返されるイメージは、バッキング付きのカスタムDataBufferFloat
です (つまり、サンプルは 3 つのサンプル、32 ビットのfloat
インターリーブされた RGB 形式になります)。
デフォルトでは、単純なグローバル トーン マッピングが適用され、すべての RGB 値が [0...1] の範囲に正規化されます (これにより、誰でも使用できるようにImageIO.read(hdrFile)
なり、非常に妥当な時間で画像がある程度妥当に見えます)。
HDRImageReadParam
を使用して をImageReader
インスタンスに渡すこともできますNullToneMapper
。これはさらに高速ですが、float
値は正規化されず、最大値を超える可能性があります。これにより、より表示しやすいものに変換する前に、画像データに対してカスタムのより洗練されたトーン マッピングを行うことができます。
何かのようなもの:
// Create input stream
ImageInputStream input = ImageIO.createImageInputStream(hdrFile);
try {
// Get the reader
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) {
throw new IllegalArgumentException("No reader for: " + hdrFile);
}
ImageReader reader = readers.next();
try {
reader.setInput(input);
// Disable default tone mapping
HDRImageReadParam param = (HDRImageReadParam) reader.getDefaultReadParam();
param.setToneMapper(new NullToneMapper());
// Read the image, using settings from param
BufferedImage image = reader.read(0, param);
}
finally {
// Dispose reader in finally block to avoid memory leaks
reader.dispose();
}
}
finally {
// Close stream in finally block to avoid resource leaks
input.close();
}
// Get float data
float[] rgb = ((DataBufferFloat) image.getRaster().getDataBuffer()).getData();
// TODO: Custom tone mapping on float RGB data
// Convert the image to something easily displayable
BufferedImage converted = new ColorConvertOp(null).filter(image, new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB));
// Optionally write as JPEG or other format
ImageIO.write(converted, "JPEG", new File(...));