OpenEXR的读取机制
这还是一篇学习笔记,知识重点还是领会完再敲一遍比较好。
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的读取机制的更多相关文章
- OpenEXR的采样机制
OpenEXR的输出机制是无损的,这样做会受到部分低配置电脑存储及运算带宽的限制. 当前有很多针对图像的压缩算法来解决这个问题,OpenEXR另外提供了WRITE_YC这种存储方式,这种方式会将RGB ...
- tensorflow 1.0 学习:十图详解tensorflow数据读取机制
本文转自:https://zhuanlan.zhihu.com/p/27238630 在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找 ...
- 十图详解tensorflow数据读取机制(附代码)转知乎
十图详解tensorflow数据读取机制(附代码) - 何之源的文章 - 知乎 https://zhuanlan.zhihu.com/p/27238630
- 十图详解tensorflow数据读取机制
在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 ...
- 十图详解TensorFlow数据读取机制(附代码)
在学习TensorFlow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 ...
- Tensorflow数据读取机制
展示如何将数据输入到计算图中 Dataset可以看作是相同类型"元素"的有序列表,在实际使用时,单个元素可以是向量.字符串.图片甚至是tuple或dict. 数据集对象实例化: d ...
- TensorFlow的数据读取机制
一.tensorflow读取机制图解 首先需要思考的一个问题是,什么是数据读取?以图像数据为例,读取的过程可以用下图来表示 假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003 ...
- 【转载】 十图详解tensorflow数据读取机制(附代码)
原文地址: https://zhuanlan.zhihu.com/p/27238630 何之源 深度学习(Deep Learning) 话题的优秀回答者 --------------- ...
- OpenEXR的输出机制
最近在一直在研究OpenEXR这个软件.这个软件的图像输出机制很有意思,特地分享一下学习心得,就当是笔记了. 我的OpenEXR软件版本是2.2.0,系统平台是win7. 安装完毕OpenEXR之后我 ...
随机推荐
- ORA-00600: internal error code, arguments: [kcblasm_1], [103], [] bug
巡检发现存在alert 日志存在ORA-600 1.0 查询alter 对应的Trace日志 /oracle/admin/fgsquery/udump/fgsquery_ora_21777.trc O ...
- 使用matlab和ISE 创建并仿真ROM IP核
前言 本人想使用简单的中值滤波进行verilog相关算法的硬件实现,由于HDL设计软件不能直接处理图像,大部分过程都是可以将图像按照一定的顺序保存到TXT文档中,经过Modelsim仿真后,处理的数据 ...
- css完成下图
<div></div> div{ height: 48px; width: 80px; padding: 0 16px 0 32px; background: rgba(0,0 ...
- rest-framework之分页器
rest-framework之分页器 本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和 ...
- UV纹理+修改器:VertexWeightEdit+修改器:Mask遮罩
UV纹理+修改器: VertexWeightEdit+修改器: Mask遮罩 基本流程, 如下图,准备地图一份, 黑白色即可. 纹理使用颜色绘制权重. 白色为1, 黑色为0. 新增球体, 细分多次, ...
- 【HDOJ1811】【并查集预处理+拓扑排序】
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) ...
- Java 8 实战
Java8 函数式接口,方法传递与Lambda Java8新特性 方法作为参数传递给方法,方法成为一等公民 Lambda,匿名函数 Stream API : 将一系列相关操作用流水线的思想分配到CPU ...
- centos6.8 搭建zabbix被监控端
System:Centos 6.8 Zabbix-agent:3.2.1 1 安装对应版本的zabbix的yum源,官方网站中没有找到zabbix3.0支持的centos6的源,所以用的3.2 #rp ...
- 《DSP using MATLAB》Problem 5.9
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- Linux 命令:文件目录操作与实例
来源: http://blog.51cto.com/yuanzhitang/2056994 本文介绍基础的文件操作:创建,移动,编辑,删除 文件和文件夹 命令与案例: mkdir 创建目录 - ...