我正在关注Cinder上的教程,您可以在其中将图像加载和显示为cinder::gl::Texture
对象。这个类没有convert2Grayscale
方法,所以我可以自己实现类似的东西吗?我是否可以访问可以应用简单算法的单独像素?(访问像素实际上更重要,因为我想将它用于另一个项目)
问问题
494 次
2 回答
2
每个像素由一个 3D 向量 [R,G,B] 表示,其中 R 是红色通道 [0,1] 中的值,G 是绿色通道 [0,1] 中的值,B 是在蓝色通道的 [0,1] 中。将 3D RGB 像素转换为标量 Y(表示 [0,1] 中的光强度(即灰度))的最简单方法是使用以下公式:
Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
大多数系统中的 gamma 等于 2.2
现在,就 cinder 中图像像素的访问而言,您必须将图像加载到 Surface 对象上。cinder 中的表面对象具有用于访问单个像素的接口函数。请参阅这个惊人的教程如何做到这一点:http ://www.creativeapplications.net/tutorials/images-in-cinder-tutorials-cinder/
于 2014-02-16T01:46:54.433 回答
1
更简单的方法,如 Cinder 网站上的“ Hello, Cinder ”教程所示:
- 将图像加载到 Channel 对象中,默认情况下会立即将其全部转换为灰度。
使用该 Channel 对象来初始化可以在您的
draw()
方法中使用的 Surface 对象,例如:无效 MyApp::setup() {
Url url( "http://libcinder.org/media/tutorial/paris.jpg" ); mChannel = Channel32f( loadImage( loadUrl( url ) ) ); mTexture = mChannel; mDrawImage = true;
}
无效的 TutorialApp::draw()
{
gl::clear( Color( 0, 0, 0 ), true ); if( mDrawImage ) { mTexture.enableAndBind(); gl::draw( mTexture, getWindowBounds() ); }
}
于 2014-03-14T21:16:44.470 回答