最近在一直在研究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. Codeforce 9C - Hexadecimal's Numbers

    One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got ...

  2. Spring Boot 揭秘与实战(二) 数据存储篇 - Redis

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用 redisTemplate 操作4. 总结 3.1. 工具类 ...

  3. [LeetCode&Python] Problem 13. Roman to Integer

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  4. P2216 [HAOI2007]理想的正方形(dp+单调队列优化)

    题目链接:传送门 题目: 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表 ...

  5. (4)django的新手三件套(返回页面、返回字符、重定向)

    from django.shortcuts import render,HttpResponse,redirect 新手三件套,前期开发都会用到 render   #向浏览器返回页面 HttpResp ...

  6. C++学习(二十七)(C语言部分)之 预处理命令

    结构体 联合 枚举 联合 只能保存最后赋值的结果枚举 所有可能值列出来 预处理命令是在编译前期的阶段 代码-(编译)-->可执行文件(exe)预编译 编译前对代码处理 *1.插入头文件的内容 # ...

  7. 【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  8. LG4980 【模板】Polya定理

    题意 题目描述 给定一个$n$个点,$n$条边的环,有$n$种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对$10^9+7$取模 注意本题的本质不同,定义为:只需要不能通过旋转与别的染色方 ...

  9. linux令普通用户拥有root权限

    如题,平时我们在自己电脑上玩linux,基本都是一个root用户就够了(反正我99%时间都是直接用root用户登录系统),可如果在公司里就不行了,有时候需要多个用户对系统具有root权限,类似与一个系 ...

  10. sofa graphql 2 rest api webhook 试用

    sofa 的webhook实际上就是将graphql 的subscription 进行了扩展,当接受到sub 请求的时候 再做一次http 的转发处理,方便rest api 的访问 环境准备 环境还是 ...