RGBE(*.hdr, The RADIANCE Picture File Format)文件格式解析

本文介绍了RGBE(*.hdr, The RADIANCE Picture File Format)格式的解析过程,包括检查文件头、读取数据等步骤,并讨论如何将RGBE数据转换为适合OpenGL的float32格式,用于基于图像的光照处理。" 72899046,4855847,深度学习基础:逻辑回归与人工神经网络解析,"['神经网络', '深度学习', '机器学习', '数据挖掘']
摘要由CSDN通过智能技术生成

这个文件是一种HDR格式。最近玩OpenGL想要做基于图像的光照,但是——我得弄个HDR图片。最终,我选择了Radiance RGBE格式(下面称作rgbe格式)。因为能在这里白嫖到一些。在不想用库的情况下,于是便参考std_imageRGBE的官方解释,编写了这篇文章。

不同于PNG格式那样分块,rgbe格式只包括两个部分。一个很小的文件头,和一段通常很大的文件数据。文件数据是RLE压缩的:

文件头很简单,它是一段ASCII字符串。文件头里面的字符串是一行一行的,可以有空行,以#打头的是注释,可以出现在任何位置,应该被忽略。同时,最开始的几个字符是"#?RADIANCE"。紧接着是XXX=XXX这样的文件信息。我们随便找一个rgbe文件格式,可以看到它的文件头:

#?RADIANCE
# Made with 100% pure HDR Shop
FORMAT=32-bit_rle_rgbe
EXPOSURE=          1.0000000000000

-Y 128 +X 256

其中,各个数据含义如下:

 
FORMAT 文件数据格式, 32-bit_rle_rgbe表示RLE编码的数据
EXPOSURE 曝光度,一般是1,不管它了吧~
-Y 指定图像高度
+X 指定图像宽度

现在,开始干正事——解析rgbe文件,把它转换为[float32 : R], [float32 : G], [float32 : B]的数据。因为float是4字节的,所以输出结果也是对齐的。不需要有步长处理。这样就可以直接送入OpenGL了。

检查文件头

现在来梳理一下我们的程序——首先,需要一个函数来检查文件头。假定fs是我的文件读取流(下同)的话,数一数,文件头是是一个字符('#', '?', 'R', 'A', 'D', 'I', 'A', 'N', 'C', 'E', '\n'),因此:

bool HDRImg::isRadianceFile(BuffISteam &fs) noexcept
{
    bool r;
    char tmp[12];
    r = fs.Read(tmp, 11);                                       // 尝试读取文件头
    tmp[11] = '\0';                                             // 封闭字符串
    if (r == false || strcmp("#?RADIANCE\n
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值