最近在一直在研究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的输出机制的更多相关文章

  1. OpenEXR的采样机制

    OpenEXR的输出机制是无损的,这样做会受到部分低配置电脑存储及运算带宽的限制. 当前有很多针对图像的压缩算法来解决这个问题,OpenEXR另外提供了WRITE_YC这种存储方式,这种方式会将RGB ...

  2. Cocos2d-x之Log输出机制

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多 ...

  3. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  4. 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...

  5. OpenEXR的读取机制

    这还是一篇学习笔记,知识重点还是领会完再敲一遍比较好. OpenEXR通过RgbaInputFile这个接口读取RGBA ONLY图像文件信息,该接口通过dataWindow()方法获取图像边界坐标信 ...

  6. clog,cout,cerr 输出机制

    clog:控制输出,使其输出到一个缓冲区,这个缓冲区关联着定义在 <cstdio> 的 stderr. cerr:强制输出刷新,没有缓冲区. cout:控制输出,使其输出到一个缓冲区,这个 ...

  7. C++中的cout输出机制

    代码: #include <iostream> using namespace std; int hello(){ cout<<"hello"<< ...

  8. Java的输入/输出操作

    Java的输入\输出机制 计算机的基本功能就是通过输入输出设备与外部其他设备尽心数据的交互,从其他设备读入数据叫做输入操作,将计算机内的数据写入到其他设备叫做输出操作.可以向计算机发送数据.又可以接受 ...

  9. Qt 日志输出

    Qt学习(3)日志输出 普通的打印输出 用 QtCreator 开发 Qt 程序时, 经常需要向控制台打印一些参数.有时候是查看对象的属性是否被正确设置,有时候是查看程序是否执行了某一段代码,或者执行 ...

随机推荐

  1. SQL注入之Sqli-labs系列第十五关和第十六关(基于POST的时间盲注)

    开始挑战第十五关(Blind- Boolian Based- String)和 第十六关(Blind- Time Based- Double quotes- String) 访问地址,输入报错语句 ' ...

  2. Spring Batch框架流程的简单介绍

    Spring Batch流程介绍: 上图描绘了Spring Batch的执行过程.说明如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器里装了若干Step,Batch中实际干活的也 ...

  3. java网络编程ServerSocket类 和Socket类的常用构造方法及其方法

    Socket类Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号.Socket(String host, int po ...

  4. ubuntu discuz 该函数需要 PHP 支持 XML。请联系空间商,确定开启了此项功能

    apt-get install php-xml apt-get install php-xml-parser

  5. PRCT-1302 the OCR has an invalid ip address

    PRCT-1302 the OCR has an invalid ip address 1. 报错信息 an internal error occurred within cluster verifi ...

  6. 基于hiredis,redis C客户端封装

    项目中需要用到redis就封装了一下,基于hiredis,只封装了string和哈希的部分方法.编译时加入-D__USER_LOCK__添加线程安全. suntelRedisCli.h #ifndef ...

  7. 20155219 2016-2017-2 《Java程序设计》第10周学习总结

    20155219 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计 ...

  8. 2017年秋软工-PSP总结报告

    一.回顾1 回顾本学期第一次作业[https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/876]. ==>本学期我的第一次作业博客[h ...

  9. 服务器-华为RH2288H V3-Server 2008R2忘记登录密码操作方法

    1.插入PE盘,重启服务器. 下载地址:http://pan.baidu.com/s/1c16cP6C 密码: 18hq 注:这是支持全系列阵列卡的专用服务器PE工具,市面上的绝大多数PE在服务器中都 ...

  10. django-dailyfresh

    Hold on ,learn by myself! redis nosql - 不支持sql语法 - 存储数据都是KV形式 - Mongodb - Redis - Hbase hadoop - Cas ...