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

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. web前端优化

    在谈到Web优化之前,我们回到一个更原始的问题,Web前端的本质是什么.我的理解是: 将信息快速并友好的展示给用户并能够与用户进行交互.快速的意思就是在尽可能短的时间内完成页面的加载,试想一下当你在淘 ...

  2. [转]内存分配malloc, new , heapalloc

    malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较 http://www.cppblog.com/woaidongmao/archive/2011/08/12/1531 ...

  3. JavaScript数据类型-2---Undefined、 Null、 Boolean、 Number、 String.

    学习目标 1.掌握JavaScript的数据类型 2.掌握typeof操作符 3.掌握Undefined 4.掌握null JavaScript的数据类型 ECMAScript中有5种简单数据类型(也 ...

  4. 安卓 dex 通用脱壳技术研究(二)

    0x03 DexHunter代码分析 DexHunter 实现中,只需要修改一处文件:dalvik\vm\native\dalvik_system_DexFile.cpp 下面是BeyondCompa ...

  5. LBS推荐系统的设计方法

    https://www.csdn.net/article/2015-12-24/2826554 http://www.datayuan.cn/article/14797.htm https://my. ...

  6. Bagging-Adaboost-RF的粗糙理解

    三种方法都是组合方法,组合方法是使用多个分类器进行投票[构造每个分类器的样本都是通过有放回抽样得到的] 1.Bagging(装袋):k次抽样,训练k次,得到k个模型(分类器),等权重投票 2.Adab ...

  7. linux最常用的20个命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  8. 再回首 基本数据类型和 if语句

    一 变量:(使用变量是不能加引号,要不就变成字符串了) 变量的命名规则: 1.数字,字母,下划线组成. 2.变量不能是数字开头 3.区分大小写 4.不要使用中文或者拼音 5.要有相应的意义 6.不能使 ...

  9. java-权限修饰符的区别

    说明:所谓访问权限,是指对象是否可以通过“.”运算符操作自己的变量或通过“.”运算符使用类中的方法. 1.Java中的四种访问修饰符:public.protected.default(无修饰符,默认) ...

  10. [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]

    https://codeforces.com/contest/1056/problem/B 题意:输入n,m    求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...