OpenEXR的输出机制
最近在一直在研究OpenEXR这个软件。这个软件的图像输出机制很有意思,特地分享一下学习心得,就当是笔记了。
我的OpenEXR软件版本是2.2.0,系统平台是win7。
安装完毕OpenEXR之后我们可以在../vc/share/doc/OpenEXR-2.2.0中找到一个名为ReadingAndWritingImageFiles.pdf的帮助文档,在这个文档的Using the RGBA-only Interface for Scan Line Based Files章节中提供了这样一个例子:
void writeRgba1 (const char fileName[],
const Rgba *pixels,
int width,
int height)
{
RgbaOutputFile file(fileName,width,height,WRITE_RGBA); //
file.setFrameBuffer(pixels,,width); //
file.writePixels(height); //
} struct Rgba
{
half r;
half g;
half b;
half a;
}
代码第一行声明了一个输出函数,有四个参数,fileName是文件名,pixels是一个指向Rgba结构体的指针,Rgba结构体在第十一行有相关定义。width和height就是显示宽高及数据宽高了。这四个值会存储到该文件的header中。
第6行中定义了一个名为file的RgbaOutputFile对象,WRITE_RGBA表示输出结果为包含rgba四个half类型的通道。
第7行的setFrameBuffer()方法开始为file类的执行过程分配内存,会将扫描到的像素指针地址存储到相应的内存地址中,1表示只扫描当前行,width表示在当前行上的扫描宽度。如果某像素的坐标为pixel(x,y),那么该像素坐标的指针的内存地址为:pixels+ 1*x+width*y。通过这个计算式可以很容易找到某像素指针的地址。这也是C++直接与硬件对话的一个体现。
第8行的writePixels()方法会将内存中存储的多少行数据写入到具体文件中,height表示有多少行会被写入文件。该方法默认不会把所有行都输出,所以需要通过height参数指定一下。很多软件设计成渲染多少行就显示多少行,通过对height值的使用可以灵活应对各种需求。
IlmImf库中允许扫描从上至下或者从下至上,这个属性会保存在header中,名为:INCREASING_Y和DECREASING_Y,该属性默认为从上到下扫描,即INCREASING_Y。为什么这样设置,因为OpenEXR也是基于OpenGL的,OpenGL就是默认坐标原点在画面左上角,所以INCREASING_Y就是从上往下扫描。
这个笔记主要用来提醒自己OpenEXR与OpenGL之间的关系,不仅在坐标系上两者一致,在很多特点上也是如此,今后OpenEXR的学习完全可以贯穿到OpenGL的学习中,举一反三,形成一个基本的思维体系吧。
为什么要学习OpenEXR呢,首先当前大部分软件都有对该标准的支持,而且该标准将来会成为高端图像行业的趋势,毕竟ILM的号召力不是盖的。
掌握该标准,CG的基础才能扎实,而不是流于表面。
OpenEXR的输出机制的更多相关文章
- OpenEXR的采样机制
OpenEXR的输出机制是无损的,这样做会受到部分低配置电脑存储及运算带宽的限制. 当前有很多针对图像的压缩算法来解决这个问题,OpenEXR另外提供了WRITE_YC这种存储方式,这种方式会将RGB ...
- Cocos2d-x之Log输出机制
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多 ...
- 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...
- 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...
- OpenEXR的读取机制
这还是一篇学习笔记,知识重点还是领会完再敲一遍比较好. OpenEXR通过RgbaInputFile这个接口读取RGBA ONLY图像文件信息,该接口通过dataWindow()方法获取图像边界坐标信 ...
- clog,cout,cerr 输出机制
clog:控制输出,使其输出到一个缓冲区,这个缓冲区关联着定义在 <cstdio> 的 stderr. cerr:强制输出刷新,没有缓冲区. cout:控制输出,使其输出到一个缓冲区,这个 ...
- C++中的cout输出机制
代码: #include <iostream> using namespace std; int hello(){ cout<<"hello"<< ...
- Java的输入/输出操作
Java的输入\输出机制 计算机的基本功能就是通过输入输出设备与外部其他设备尽心数据的交互,从其他设备读入数据叫做输入操作,将计算机内的数据写入到其他设备叫做输出操作.可以向计算机发送数据.又可以接受 ...
- Qt 日志输出
Qt学习(3)日志输出 普通的打印输出 用 QtCreator 开发 Qt 程序时, 经常需要向控制台打印一些参数.有时候是查看对象的属性是否被正确设置,有时候是查看程序是否执行了某一段代码,或者执行 ...
随机推荐
- JAVA个人小程序GUI篇-收银(标签、按钮、复选框、下拉标、文本域、表格······)
如果用eclipse需先装载windowsbuild //导入包 import java.awt.BorderLayout; import java.awt.EventQueue; import ja ...
- Redis持久化--RDB+AOF(转)
1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中 ...
- 【计算机视觉】KCF算法
code opencv3.3.1-contrib ---- TrackerKCF.cpp opencv如何更新目标区域的过程: // calculate filter response if(par ...
- Prism for WPF
Prism for WPF Prism for WPF初探(构建简单的模块化开发框架) 先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to ...
- Web四则混合运算
一.代码1: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...
- javascript json 判断项目 是否存在不存在插入foreach 组合 输出
var a = []; var i; a.push({ key: "key1", value: 23 }); a.push({ key: "key2", val ...
- MATLAB中版本和日期函数
本博客中输出版本号和日期的子函数,今天才发现忘记上代码了,这里补上 function banner() %% --------------------------------------------- ...
- mongodb 通过mongodump来备份Sharded Cluste分片集群
1,mongodb所有组件官方文档地址:https://docs.mongodb.com/manual/reference/command/,所有的基础组件都在里面,包括备份恢复的mongodump. ...
- hive 分隔符替换
Hive建表的时候虽然可以指定字段分隔符,不过用insert overwrite local directory这种方式导出文件时,字段的分割符会被默认置为\001,一般都需要将字段分隔符转换为其它字 ...
- Laya学习
IDE安装 https://www.jianshu.com/p/88fa76a5becc npm uninstall -g typescript npm install -g typescript@2 ...