这还是一篇学习笔记,知识重点还是领会完再敲一遍比较好。

OpenEXR通过RgbaInputFile这个接口读取RGBA ONLY图像文件信息,该接口通过dataWindow()方法获取图像边界坐标信息,通过该边界坐标信息即可计算出图像的heigth及width。

此时的图像文件的数据还未以OpenEXR标准的方式存储,OpenEXR是如何将这些数据标准化的呢?首先定义一个Array2D<Rgba>的模板&pixels,pixels是一个数组的引用,然后通过pixels.resizeErase(height,width)将该数组与图像数据统一,设定该数组的宽高格式,pixels.resizeErase(height,width)就等于是在内存上为该数组分配了一个额定大小的空间,该数组的宽高与图像的宽高一致。

下一步就是将pixels的每一个元素与图像中的每一个像素建立映射关系了。通过file.setFrameBuffer(pixels,1,width),可以为每一个图像像素建立一个指针,该指针存储于pixels数组中,并且这些地址是连续的。当我们想访问图像数据某一部分时,我们就可以通过访问这个数组中的指针来完成了。例如:pixels[x][y]就可以获得一个坐标为(x,y)的像素的指针地址。这样做既保护了图像数据的原始性,又提高了访问的灵活性。OpenEXR的设计确实到位。当然这种设计跟OpenGL也是如出一辙的~

接下来就是通过对file.readPixels(dw.min.y,dw.max.y)来调用并将高度在dw.min.y和dw.max.y之间的像素拷贝到buffer中了。由于数组中记录的地址是连续的,这样的设计更适合cpu的多级缓冲特质,这也是图像能够被高效处理的一个保证。

以上是OpenEXR的RgbaInputFile接口的最简单的使用。在实际工作中,我们只想观看图像的某一部分,这时候就需要利用OpenEXR成族访问的特点了。

在Reading an RGBA Image File in Chunks这个单元中给出了这样的例子:

void
readRgba2 (const char fileName[])
{
RgbaInputFile file (fileName);
Box2i dw = file.dataWindow();
int width = dw.max.x - dw.min.x + ;
int height = dw.max.y - dw.min.y + ;
Array2D<Rgba> pixels (, width);
while (dw.min.y <= dw.max.y)
{
file.setFrameBuffer (&pixels[][] - dw.min.x - dw.min.y * width,, width);
file.readPixels (dw.min.y, min (dw.min.y + , dw.max.y));// processPixels (pixels)
dw.min.y += ;
}
}

下面分析这段代码:

首先声明一个RgbaInputFile函数,函数结构体中首先定义一个名为file的RgbaInputFile类用于读取图像信息。

然后定义一个名为dw的Box2i对象,该对象通过dataWindow()方法获取图像的边界信息。

通过边界信息进而计算得出图像的宽高。

用Array2D<>模板定义了一个应用于Rgba结构体的数组。该数组名为pixels。同时我们注意到,该数组的高度范围只有10,也就是说该数组只存储十行图像数据。这与之前建立一个储存全部行的数组不一样。现在建立的数组明显占用更小的储存空间,存入到buffer中更具灵活性。也就是说cpu缓存机制并不是那么强大的电脑依然可以很轻松的使用RgbaInputFile接口。
之后一段代码引入了一个非常精妙的while循环,这个循环很有意思。dw.min.y这个值是可以修改的,在循环句尾有这样一句:dw.min.y+=10,更新一下while语句中的判断条件,同时也可以保证pixels在每一次循环中递归的为图像中的十行像素分配地址,不得不感叹ILM的工程师功力深厚。

以上。

OpenEXR的读取机制的更多相关文章

  1. OpenEXR的采样机制

    OpenEXR的输出机制是无损的,这样做会受到部分低配置电脑存储及运算带宽的限制. 当前有很多针对图像的压缩算法来解决这个问题,OpenEXR另外提供了WRITE_YC这种存储方式,这种方式会将RGB ...

  2. tensorflow 1.0 学习:十图详解tensorflow数据读取机制

    本文转自:https://zhuanlan.zhihu.com/p/27238630 在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找 ...

  3. 十图详解tensorflow数据读取机制(附代码)转知乎

    十图详解tensorflow数据读取机制(附代码) - 何之源的文章 - 知乎 https://zhuanlan.zhihu.com/p/27238630

  4. 十图详解tensorflow数据读取机制

    在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 ...

  5. 十图详解TensorFlow数据读取机制(附代码)

    在学习TensorFlow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 ...

  6. Tensorflow数据读取机制

    展示如何将数据输入到计算图中 Dataset可以看作是相同类型"元素"的有序列表,在实际使用时,单个元素可以是向量.字符串.图片甚至是tuple或dict. 数据集对象实例化: d ...

  7. TensorFlow的数据读取机制

    一.tensorflow读取机制图解 首先需要思考的一个问题是,什么是数据读取?以图像数据为例,读取的过程可以用下图来表示 假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003 ...

  8. 【转载】 十图详解tensorflow数据读取机制(附代码)

    原文地址: https://zhuanlan.zhihu.com/p/27238630 何之源 ​ 深度学习(Deep Learning) 话题的优秀回答者       --------------- ...

  9. OpenEXR的输出机制

    最近在一直在研究OpenEXR这个软件.这个软件的图像输出机制很有意思,特地分享一下学习心得,就当是笔记了. 我的OpenEXR软件版本是2.2.0,系统平台是win7. 安装完毕OpenEXR之后我 ...

随机推荐

  1. 河工大玲珑校赛重现の rqy的键盘

    题目传送门:http://218.28.220.249:50015/JudgeOnline/problem.php?id=1263 1263: rqy的键盘 时间限制: 1 秒  内存限制: 128 ...

  2. epoll_wait惊群问题

    项目接入层用的模型是,主线程创建listenfd,传入6个子线程,每个子线程一个事件循环,epoll_wait这个listenfd. 如果是listenfd,则epoll_wait返回调用accept ...

  3. Maxscale-在第一个节点的配置

    [maxscale]threads=4 ##### Write Service, need to set address[server1]type=serveraddress=172.16.50.36 ...

  4. Promise-js中的同步和异步

    js中的同步和异步   自从读了研后,走上了学术之路,每天除了看论文就是做实验,最后发现自己还是喜欢开发呀,于是我又重回前端啦~ 隔了这么久没学前端,好像很多东西都忘了不少,而且不得不说前端的技术更新 ...

  5. 小米4c刷LineageOS

    注意,本文仅限于小米4c,其他手机仅可参考步骤.如下rom,su,gapps包的下载都是小米4c的,深刷miflash也仅适用于小米手机.准备工作:请自行备份好手机内的个人资料. 电脑环境,usb驱动 ...

  6. 04 jsp,EL,JSTL

    jsp:Java Server Page  什么是jsp?从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Se ...

  7. ng-repeat的用法:

    -------------------------------------转载: 遍历数组:    <li ng-repeat="item in array">{{it ...

  8. 【shell编程】之基础知识-流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  9. vue 2.0 vue.set的使用方法

    这里我定义了一个列表数据,我将通过三个不同的按钮来控制列表数据. 首先在列表中动态新增一条数据: <!DOCTYPE html><html><head lang=&quo ...

  10. 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)