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

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. 使用Redis构建支持程序

    在Linux和Unix世界中,有两种常见的记录日志的方法.第一种是将日志记录到文件里面,然后随着时间流逝不断地将一个有一个日志行添加到文件里面,并在一段时间之后创建新的日志文件.包括Redis在内的很 ...

  2. verilog实现中值滤波

    前言 项目需要,想要实现算法中的其中一步即中值滤波,同时,因为图像处理部分中值滤波相对来说还是比较简单的,将中值滤波的硬件实现作为进入FPGA领域的第一次尝试.虽然说网上有较多关于中值滤波的文档,可是 ...

  3. 【02_258】Add Digits

    Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...

  4. [LeetCode&Python] Problem 21. Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  5. XML中DTD,XSD的区别与应用

    XML我们并不陌生,在企业级应用中有很广的用途.具体就不再说,下面介绍一下DTD,XSD的区别并以XSD为例看spring中定义与使用.1.DTD(Documnet Type Definition)D ...

  6. 腾讯云JavaWeb环境配置

    腾讯云服务器Centos7系统配置javaWeb运行环境 java1.8 运行命令列表 yum list java-* 安装相应版本的jdk,一般含有devel的就是真正的jdk,如:java-1.8 ...

  7. PTA——猜数字游戏

    PTA 7-24 猜数字游戏 #include <stdio.h> int main() { int num, times; scanf("%d %d", &n ...

  8. HTML的属性

    data-的好处:对dom的一些自定义标识,通过这些标识符可以传递一些信息到相应的事件里:dom.dataset['属性名称'] 将节点变成数组 渐进式渲染:就是加载到哪里就显示到哪里 css和js的 ...

  9. maven 总结整理(二)——download source code

    当我们用maven下载jar包时,有时希望下载jar包的源代码,此时可以在pom.xml文件中,进行设置. <build>    <finalName>WebProject&l ...

  10. zabbix——拓扑图入门

    zabbix的拓扑图是动态的,当你配置好拓扑图后,一旦网络中那个节点出现了问题,很容易在拓扑图中看出问题具体出在哪个位置. 新建一个拓扑图 我们常用到的图标有rack(机柜)还有rackmountab ...