gpt4 book ai didi

java - imageIO 打开 .HDR 文件

转载 作者:行者123 更新时间:2023-12-01 11:19:33 26 4
gpt4 key购买 nike

我需要打开 .hdr 文件并对其进行处理,但 imageIO 不支持该格式。

问题是我需要尽可能减少信息丢失:32bpc 是完美的,16 就可以了,少了 16 就不行了。

我想到了 3 种可能的解决方案:

  1. 找到一个允许我打开 .HDR 文件的插件。我一直在寻找它,但没有运气;
  2. 找到一种方法将 .HDR 文件转换为我可以找到插件的格式。也许是蒂夫?也尝试过这个,但仍然没有运气;
  3. 将动态范围从 32bpc 减少到 16bpc,然后将其转换为 png。这很棘手,因为一旦我有了一个 png 文件,我就赢了,但是在不杀死图像的情况下缩小范围并不容易。

你会建议我做什么?您知道如何使这 3 个选项之一发挥作用吗?或者你有更好的主意吗?

最佳答案

You can now read .HDR using ImageIO 。 :-)

这是第一个版本,因此边缘可能有点粗糙,但应该适用于标准(默认设置)Radiance RGBE .HDR文件。

返回的图像将是自定义的BufferedImageDataBufferFloat支持(即样本将采用 3 个样本、32 位 float 交错 RGB 格式)。

默认情况下,应用一个简单的全局色调映射,并且所有 RGB 值都将标准化为范围 [0...1](这允许任何人只使用 ImageIO.read(hdrFile) 并且图像看起来有些合理,在一个非常合理的时间)。

也可以传递 HDRImageReadParamImageReader具有 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(...));

关于java - imageIO 打开 .HDR 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31412662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com