我需要打开一个.hdr文件并处理它,但是imageIO不支持这种格式。
问题是,我需要尽可能少地减少信息损失: 32bpc是完美的,16是好的,16不能工作。
我想出了三种可能的解决方案:
你建议我怎么做?你知道如何使这3种选择之一起作用吗?还是你有更好的主意?
发布于 2015-07-28 20:47:56
这是第一个版本,所以它的边缘可能有点粗糙,但应该适用于标准(默认设置) Radiance RGBE .HDR文件。
返回的图像将是一个自定义BufferedImage与DataBufferFloat支持(即,样本将在3个样本,32位float交错的RGB格式)。
默认情况下,应用一个简单的全局音调映射,所有RGB值都将标准化为范围0.。
还可以使用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(...));https://stackoverflow.com/questions/31412662
复制相似问题