首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >imageIO打开.HDR文件

imageIO打开.HDR文件
EN

Stack Overflow用户
提问于 2015-07-14 16:47:00
回答 1查看 2.7K关注 0票数 1

我需要打开一个.hdr文件并处理它,但是imageIO不支持这种格式。

问题是,我需要尽可能少地减少信息损失: 32bpc是完美的,16是好的,16不能工作。

我想出了三种可能的解决方案:

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

你建议我怎么做?你知道如何使这3种选择之一起作用吗?还是你有更好的主意?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-28 20:47:56

现在您可以使用.HDR阅读ImageIO。。:-)

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

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

默认情况下,应用一个简单的全局音调映射,所有RGB值都将标准化为范围0.

还可以使用HDRImageReadParamImageReader实例传递给NullToneMapper。这甚至更快,但是float值将是非规范化的,并且可能超过最大值。这允许您做自定义,更复杂的色调映射图像数据,然后转换为更可显示的东西。

类似于:

代码语言:javascript
复制
// 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(...));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31412662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档