Author Topic: [Cinder]关于图片概念的剖析Channel vs Surface vs Texture vs Image  (Read 2461 times)

vinjn

  • Moderator 版主
  • Hero Member
  • *****
  • Posts: 587
原帖 http://forum.libcinder.org/topic/channel-vs-surface-vs-texture-vs-image

Surface/Channel 是为基于CPU的内存管理设计的,而gl::Texture是存储在显卡GPU中的。

Channel的名字来自于图像的通道,即颜色通道或alpha透明度通道。它可以被视为
一张灰度图片,但是在很多语境下它表示的是red/green/blue/alpha,在另一些
时候则是另一个色彩空间(比如HSB)。参考Photoshop中的通道:



Surface是一组Channel,总是包含红绿蓝,当然有时候也包括alpha。
在大多数时候无需操作特定Channel,但是允许你这么做。

如下的代码:
Code
#include "cinder/ip/Fill.h"
ip::fill( mySurface.getChannelRed(), (uint8_t)128 );
将Surface8u类型的红色通道填充为50%的红色,即数值128。

若想通过一个Channel创建Surface,你可以直接调用构造函数,你将自动得到一张
灰度图片。正如预期,红绿蓝三个通道的值将是相同的,等于下例中myChannel 的值:
Surface mySurface( myChannel );

若将Surface转换为单个Channel,得到的是单个灰度的Channel,用法类似:
Code
Channel myChannel( mySurface );
若想混合使用8u和32f类型的对象亦可,例如:
Code
Channel8u myChannel( ... );
Surface32f myHdrSurface( myChannel );
最后,可以传递一个Channel给gl::Texture的构造函数,剩下的事情会自动进行 — 贴图使用
一个更小巧的内部格式以节省显存空间。若传递Channel32f亦可—这个格式通常用于表示 HDR 的数据。

类似的,如果传递一个Channel 给writeImage(),Cinder将明白它处理的是灰的的数据,
并且使用优化的图片格式,比如PNG它有个特别的小巧灰度模式。如果传递的是一个Channel32f,
那么使用的是16位的灰度模式,这是为了尽量多得保存精度。有趣的是,也可以传递gl::Texture
给writeImage()。

« Last Edit: September 11, 2013, 04:35:00 PM by vinjn »

Tags: