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 程序时, 经常需要向控制台打印一些参数.有时候是查看对象的属性是否被正确设置,有时候是查看程序是否执行了某一段代码,或者执行 ...
随机推荐
- thinkphp 参数传递方式(基础)
我今天下午主要学习了thinkphp5.0的路由部分,我下面总结一下我主要学习到的知识点: 路由定义: 有两种方式: (1).动态注册: eg: Route::rule('hello','index/ ...
- DQN-深度Q网络
深度Q网络是用深度学习来解决强化中Q学习的问题,可以先了解一下Q学习的过程是一个怎样的过程,实际上就是不断的试错,从试错的经验之中寻找最优解 关于Q学习,我看到一个非常好的例子,另外知乎上面也有相关的 ...
- python学习1 ---range()函数
奇怪的现象 在paython3中 print(range(10)) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢? 官网原话: In many ...
- 牛客国庆集训派对Day4 I-连通块计数(思维,组合数学)
链接:https://www.nowcoder.com/acm/contest/204/I 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- php基础-3
php的数据类型 字符串 字符串的声明:$str = "aaa"; 字符串的方法 strpos(str, find_str):该方法在一个字符串中查找需要查找的字符串,并回来该字符 ...
- 获奖感想和JAVA阶段性学习总结
一.获奖感想 事实上,这次能够获得小黄衫,实在是出乎我的意料.毕竟班级中还有不少比我优秀的人,但我不会妄自菲薄.我知道,这件小黄衫不仅仅是老师对我的奖励,更是对我的一种鞭策,一种激励.它要求我要在以后 ...
- String、StringBuffer、StringBuidler 知识整理
String.StringBuffer.StringBuidler.这三个家伙,大家都不陌生,肯定也都会用.三者异同大家都能说出来,但是其根本原因是什么呢?带着下面问题,学习一下. 第一.String ...
- 【spring源码分析】spring关于循环依赖的问题
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- setjmp与longjmp非局部跳转函数的使用
[root@bogon code]# cat c.c #include<stdio.h> #include<setjmp.h> static jmp_buf env;//定义全 ...
- ClusterControl docker 环境搭建
ClusterControl 是一款比较强大的数据库管理平台,包含了丰富的数据库管理功能. 我们可以用来方便的进行数据管理 测试使用docker-compose 管理 环境准备 docker-comp ...