当前位置: 首页 > 知识库问答 >
问题:

imageIO打开。HDR文件

印飞捷
2023-03-14

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

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

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

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

你会建议我做什么?你知道如何让这三个选项中的一个奏效吗?还是你有更好的主意?

共有1个答案

黎奇略
2023-03-14

您现在可以阅读了。使用图像的HDR。:-)

这是第一个版本,因此边缘可能有点粗糙,但适用于标准(默认设置)辐射RGBE<代码>。HDR文件。

返回的图像将是一个自定义的缓冲图像,带有一个数据缓冲浮点(即,样本将为3个样本,32位浮点(interleaved RGB)格式)。

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

也可以使用NullToneMapperHDRImageReadParam传递给ImageReader实例。这甚至更快,但浮动值将未规范化,并且可能超过最大值。这允许您在转换为更可显示的内容之前对图像数据进行自定义、更复杂的色调映射。

像这样的东西:

// 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(...));
 类似资料:
  • HDR

    Note 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的。这个看起来无辜的语句使我们一直将亮度与颜色的值设置在这个范围内,尝试着与场景契合。这样是能够运行的,也能给出还不错的效果。但是如果我们遇上了一个特定的区域,其

  • 打开文件 有了上述分析后,我们可以看看如果一个用户进程打开文件会做哪些事情?首先假定用户进程需要打开的文件已经存在在硬盘上。以user/sfs_filetest1.c为例,首先用户进程会调用在main函数中的如下语句: int fd1 = safe_open("sfs\_filetest1", O_RDONLY); 从字面上可以看出,如果ucore能够正常查找到这个文件,就会返回一个代表文件的文

  • 在这节,我们使我们的应用程序展示命令行传来的文件的正文。 在这后面,我们为我们的应用程序的窗口子类增加了一个私有的结构体,结构体内是一个指向GtkStack的指针。gtk_widget_class_bind_template_child_private()函数使得在实例化模板后,私有结构体中的stack成员会指向模板中的同名部件。 ... struct _ExampleAppWindowPriv

  • Luminance HDR (Qtpfsgui) 是一个对数码相片进行各种效果调整的工具。

  • 问题内容: 我正在尝试将BufferedImage写入jpeg文件,但是我的Java程序引发了异常。我能够成功将相同的缓冲区保存为gif和png。我尝试在Google上四处寻找解决方案,但无济于事。 码: 例外: 问题答案: OpenJDK没有本地JPEG编码器,请尝试使用Sun的JDK或使用库(例如JAI) AFAIK,关于“粉红色色调”,Java将JPEG保存为ARGB(仍然具有透明度信息)。

  • 根据API,Java的ImageIO为方法。 其中两种方法是: Oracle教程网站使用readfrom file方法。然而,我已经看到了许多由程序员编码的例子,这里更喜欢使用URL方法。 Exmaple: 我的问题是:如果我只是为Java桌面应用程序(而不是Java小程序)编写代码。与其他方法相比,使用URL方法是否有显著优势? 注意:在SO:usingurl或File(在ImageIO.rea