1

我正在关注Cinder上的教程,您可以在其中将图像加载和显示为cinder::gl::Texture对象。这个类没有convert2Grayscale方法,所以我可以自己实现类似的东西吗?我是否可以访问可以应用简单算法的单独像素?(访问像素实际上更重要,因为我想将它用于另一个项目)

4

2 回答 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 ”教程所示:

  1. 将图像加载到 Channel 对象中,默认情况下会立即将其全部转换为灰度。
  2. 使用该 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 回答